gitattributes para coding agents: text, eol y no reformatear generated
Resumen
.gitattributes asigna attrs por path: text, eol, ident. GitHub usa linguist-generated para ocultar diffs. Un agente que ‘normaliza CRLF’ o reescribe lockfiles genera ruido. Manual gitattributes: later lines override per attribute.

Qué resuelve
Esta pieza se queda en la decisión práctica: qué instalar, qué riesgo agrega y cómo aplicarlo sin romper operación.
.gitattributes da atributos a paths: pattern attr1 attr2. Set (text), unset (-text), valor (eol=lf). Líneas posteriores pisan por atributo. Patrones tipo gitignore, con excepces documentadas.
Un agente que corre dos2unix en todo el repo o reescribe pnpm-lock.yaml “con prettier” ignora este archivo. El man page cubre text, eol, working-tree-encoding, filtros. GitHub añade linguist-generated=true para no mostrar el diff en el PR.
No sustituye gitignore ni EditorConfig. Ignore = untracked; attributes = cómo Git trata lo trackeado. El curso instalar un agente no cubre CRLF.
Qué leer antes de tocar files
* text=auto
*.sh text eol=lf
*.bat text eol=crlf
*.png binary
pnpm-lock.yaml linguist-generated=true
dist/** linguist-generated=true
text=auto: Git detecta text vs binary y normaliza eol al commit según core.autocrlf / eol. El agente no convierte a mano.
eol=lf en *.sh: working tree y repo en LF. Forzar CRLF en scripts rompe shebangs en Linux.
binary / -text: no toques el archivo como texto.

linguist-generated
En GitHub, linguist-generated=true marca el path como generado: el PR colapsa el diff y no cuenta en el language stats. Úsalo en lockfiles, dist/, código generado. El agente no “limpia” esos files en el mismo PR que un feature, salvo que el ticket sea regenerarlos.
linguist-vendored similar para vendor. No inventes attrs que Git no conoce; linguist es de GitHub, Git core los ignora.
Receta AGENTS.md
Read .gitattributes before rewriting files.
Do not convert line endings repo-wide.
Do not prettier lockfiles or linguist-generated paths.
Match eol=lf/crlf per glob.
Si el attr está unspecified, no asumas LF. Copia un vecino del mismo glob.

FAQ
¿info/attributes? Local al clone, no se comparte. El repo usa .gitattributes en la raíz (y a veces en subdirs).
¿ident? Expande $Id$. No lo pongas en un blob binario.
¿Merge union? Attr de merge. Un agente no cambia merge drivers de paso.
¿Crear el archivo? Solo si el ticket es “fijar eol”. * text=auto es el mínimo.
Un PR cuyo 90% es pnpm-lock.yaml con linguist-generated ausente es ruido de review. Añadir el attr en un PR aparte (docs/chore) es válido; mezclarlo con un feat de producto no. El agente no “aprovecha” para reordenar el lock.
Verificado 2026-09-03 contra git help gitattributes y GitHub linguist-generated.
Lecturas relacionadas
Sigue explorando Coding Agents y otras piezas para builders.

git status para coding agents: porcelain, XY, no el long

Reusable workflows: workflow_call, no copies el YAML entre repos

schedule (cron) en GitHub Actions: UTC, no cada minuto
