tag - ¿Cuál es el propósito de `text=auto` en el archivo`.gitattributes`?
qué tipos de etiquetas existen en git (3)
En su .gitattributes
archivo .gitattributes
tiene * text=auto
. ¿Cuál es el propósito de text=auto
en ese archivo?
Asegura que las terminaciones de línea estén normalizadas. Fuente: Kernel.org
Cuando el texto se establece en "automático", la ruta se marca para la normalización automática al final de la línea. Si git decide que el contenido es texto, sus finales de línea se normalizan a LF al registrarse.
Si desea interoperar con un sistema de administración de código fuente que aplica la normalización de fin de línea, o simplemente desea que todos los archivos de texto en su repositorio se normalicen, en su lugar debe establecer el atributo de texto en "automático" para todos los archivos.
Esto asegura que todos los archivos que git considera que son texto tendrán terminaciones de línea normalizadas (LF) en el repositorio.
De Kernel.org :
Cada línea en el
.gitattributes
(o.git/info/attributes
) tiene forma:
pattern attr1 attr2 ...
Entonces aquí, el patrón es *
, lo que significa todos los archivos, y el atributo es text=auto
.
¿Qué hace text=auto
do? De la documentación:
Cuando el texto se establece en "automático", la ruta se marca para la normalización automática al final de la línea. Si Git decide que el contenido es texto, sus finales de línea se normalizan a LF al registrarse.
¿Cuál es el comportamiento predeterminado si no está habilitado?
Sin especificar
Si el atributo de texto no está especificado, Git usa la variable de configuración core.autocrlf para determinar si el archivo debe convertirse.
¿Qué hace core.autocrlf
? De los documentos:
core.autocrlf
Establecer esta variable en "verdadero" es casi lo mismo que establecer el atributo de texto en "automático" en todos los archivos, excepto que no se garantiza que los archivos de texto se normalicen: los archivos que contienen CRLF en el repositorio no se tocarán. Utilice esta configuración si desea tener terminaciones de línea CRLF en su directorio de trabajo aunque el repositorio no tenga terminaciones de línea normalizadas. Esta variable se puede configurar para que ingrese, en cuyo caso no se realiza conversión de salida.
Si crees que todo esto es tan claro como el barro, no estás solo.
Esto es lo que * text=auto
hace en mis palabras: cuando alguien comete un archivo, Git adivina si ese archivo es un archivo de texto o no, y si lo es, confirmará una versión del archivo donde se reemplazan todos los bytes CR + LF con bytes LF. No afecta directamente a qué archivos se parecen en el árbol de trabajo, hay otras configuraciones que convertirán bytes LF a bytes CR + LF al extraer un archivo.
Recomendación:
No recomendaría poner * text=auto
en el archivo .gitattributes
. En cambio, recomendaría algo como esto:
*.txt text
*.html text
*.css text
*.js text
Esto designa explícitamente qué archivos son archivos de texto, que convierten CRLF convertido a LF en la base de datos de objetos (pero no necesariamente en el árbol de trabajo). Tuvimos un repositorio con * text=auto
, y Git adivinó incorrectamente que un archivo de texto era un archivo de texto, lo que lo corrompió al reemplazar los bytes CR + LF con bytes LF en la base de datos de objetos. No fue divertido depurarlo.
Si debe usar * text=auto
, .gitattributes
como la primera línea en .gitattributes
, de modo que las líneas posteriores puedan anularlo. Esto parece convertirse en una práctica cada vez más popular.
Esa configuración es con respecto a cómo se manejan las terminaciones de línea. Cuando está habilitado, todas las terminaciones de línea se convierten a LF en el repositorio. Existen otros indicadores para tratar cómo se convierten las terminaciones de línea en su directorio de trabajo. Información completa sobre el problema aquí: Kernel.org