Guía
LF y CRLF en Git: cómo evitar cambios en todas las líneas
Entiende por qué Git puede marcar un archivo completo como modificado y fija finales de línea coherentes con .gitattributes.
por Tools in a Tab · Publicado el · Revisado el
Respuesta breve
LF y CRLF representan el final de una línea con bytes distintos. Si un editor
o Git convierte todo el archivo de un formato al otro, el diff puede mostrar
cada línea como cambiada aunque el texto visible sea igual. Define la política
en .gitattributes, renormaliza una vez y revisa ese cambio por separado de las
modificaciones funcionales.
Qué cambia realmente
- LF usa el byte
0A. - CRLF usa los bytes
0D 0A.
Por eso dos archivos que se ven iguales pueden producir hashes SHA-256 diferentes. También explica por qué un diff de bajo nivel encuentra cambios que un comparador configurado para normalizar finales de línea puede ignorar. El comparador de textos de Tools in a Tab normaliza CRLF y CR a LF para centrarse en el contenido de cada línea.
Fijar una política en el repositorio
Una base habitual para proyectos multiplataforma es:
* text=auto
*.sh text eol=lf
*.bat text eol=crlf
El atributo text permite que Git normalice texto a LF en el índice. eol=lf
o eol=crlf determina el formato solicitado en el directorio de trabajo. La
documentación oficial de gitattributes
define estos comportamientos y debe ser la referencia para casos especiales.
No marques indiscriminadamente archivos binarios como texto. Si un formato no debe transformarse, decláralo como binario, por ejemplo:
*.png binary
*.zip binary
Aplicar la norma a archivos existentes
Después de guardar .gitattributes, Git puede necesitar recalcular cómo guarda
los archivos ya seguidos. Haz la renormalización en una rama limpia y en un
commit dedicado:
git add --renormalize .
git diff --cached
Revisa el diff antes de confirmar. Si también contiene cambios de código, sepáralos para que la revisión pueda distinguir la conversión mecánica de una modificación real.
Evitar que vuelva a ocurrir
Configura el editor para respetar .gitattributes, conserva una política
versionada y no dependas únicamente de la preferencia global de cada persona.
Si un hash no coincide, comprueba el final de línea y la presencia de una línea
final antes de asumir corrupción.
La regla práctica es sencilla: Git decide la representación compartida; el editor decide cómo mostrarla. Cuando ambos siguen una norma explícita, los diffs vuelven a mostrar solo cambios significativos.