Mi procedimiento para tratar con los finales de línea es el siguiente (batalla probada en muchos repositorios):
Al crear un nuevo repositorio:
- poner
.gitattributes
en el primer commit junto con otros archivos típicos como .gitignore
yREADME.md
Cuando se trata de un repositorio existente:
- Crear / modificar en
.gitattributes
consecuencia
git commit -a -m "Modified gitattributes"
git rm --cached -r . && git reset --hard && git commit -a -m 'Normalize CRLF' -n"
-n
( --no-verify
es omitir ganchos de precompromiso)
- Tengo que hacerlo con la frecuencia suficiente como para definirlo como un alias
alias fixCRLF="..."
- repite el comando anterior
- sí, es vudú, pero generalmente tengo que ejecutar el comando dos veces, la primera vez que normaliza algunos archivos, la segunda vez incluso más archivos. En general, probablemente sea mejor repetir hasta que no se cree una nueva confirmación :)
- ir y venir entre la rama antigua (justo antes de la normalización) y la nueva varias veces. Después de cambiar la rama, ¡a veces git encontrará incluso más archivos que deben renormalizarse!
En .gitattributes
Declaro todos los archivos de texto explícitamente como LF EOL ya que generalmente las herramientas de Windows son compatibles con LF, mientras que las herramientas que no son de Windows no son compatibles con CRLF (incluso muchas herramientas de línea de comandos de nodejs asumen LF y, por lo tanto, pueden cambiar la EOL en sus archivos).
Contenido de .gitattributes
Mi .gitattributes
generalmente se ve así:
*.html eol=lf
*.js eol=lf
*.json eol=lf
*.less eol=lf
*.md eol=lf
*.svg eol=lf
*.xml eol=lf
Para averiguar qué extensiones distintas son rastreadas por git en el repositorio actual, mira aquí
Problemas después de la normalización
Una vez hecho esto, hay una advertencia más común.
Digamos master
que ya está actualizado y normalizado, y luego realiza el pago outdated-branch
. Muy a menudo, justo después de revisar esa rama, git marca muchos archivos como modificados.
La solución es hacer un commit falso ( git add -A . && git commit -m 'fake commit'
) y luego git rebase master
. Después del rebase, la comisión falsa debería desaparecer.