¿Cuál es el propósito de `text = auto` en el archivo` .gitattributes`?

129

Principalmente .gitattributesarchivo tiene * text=auto. ¿Cuál es el propósito de text=autoese archivo?

Fizer Khan
fuente

Respuestas:

77

De los documentos :

Cada línea en .gitattributes(o .git/info/attributes) archivo tiene forma:

pattern attr1 attr2 ...

Entonces, aquí, el patrón es *, lo que significa todos los archivos, y el atributo es text=auto.

¿Qué text=autohacer? De la documentación:

Cuando el texto se establece en "auto", la ruta se marca para la normalización automática de fin de 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é core.autocrlfhacer? 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 estén normalizados: 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 como entrada, en cuyo caso no se realiza ninguna conversión de salida.

Si crees que todo esto es tan claro como el barro, no estás solo.

* text=autoEsto es lo que hace en mis palabras: cuando alguien confirma 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 todos los bytes CR + LF se reemplazan con bytes LF. No afecta directamente el aspecto de los archivos en el árbol de trabajo, hay otras configuraciones que convertirán los bytes LF en bytes CR + LF al retirar un archivo.

Recomendación:

Yo no recomendaría poner * text=autoen el .gitattributesarchivo. 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 consiguen que CRLF se convierta a LF en la base de datos de objetos (pero no necesariamente en el árbol de trabajo). Tuvimos un repositorio * text=autoy Git adivinó mal para un archivo de imagen que 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 usarlo * text=auto, colóquelo como la primera línea .gitattributespara que las líneas posteriores puedan anularlo. Esto parece convertirse en una práctica cada vez más popular.

Flimm
fuente
2
¿Por qué todos llaman LF como Normal pero no CRLF? ¿Hay alguna referencia para probarlo?
Yousha Aleayoub
1
@YoushaAleayoub ¿Qué quieres decir?
Flimm
1
@YoushaAleayoub si se everyonerefiere a usted git-scm, probablemente sea porque están desarrollando un paquete * nix y, por lo tanto, usar el carácter de nueva línea * nix es normal .
Justin Moh
44
@YoushaAleayoub LF se considera b / c "normal", es común en muchas herramientas de desarrollo. Herramientas de desarrollo populares como las que git-scmprovienen de * nix. MacOS usa LF. Solo Windows (considerando solo los sistemas operativos principales) está usando CRLF. Esto hace que sea más difícil para los desarrolladores usar herramientas * nix en Windows y para todos al intercambiar archivos. Ver también Por qué CRLF .
Roi Danton el
2
@Flimm, ¿puedes explicar la diferencia entre *.txt text=autoy *.txt textpor favor? Pensé que las 4 líneas en su ejemplo anterior deberían haber sido text=auto, no solo textdespués de la extensión del archivo. Los archivos de huella de KiCad, por ejemplo (extensión ".kicad_mod"), se normalizan utilizando esta línea en su archivo gitattributes: *.kicad_mod text=auto( kicad-pcb.org/libraries/klc/G1.7 ).
Gabriel Staples
64

Asegura que las terminaciones de línea estén normalizadas. Fuente: Kernel.org

Cuando el texto se establece en "auto", la ruta se marca para la normalización automática de fin de línea. Si git decide que el contenido es texto, sus finales de línea se normalizan a LF en el registro.

Si desea interoperar con un sistema de administración de código fuente que imponga la normalización de fin de línea, o simplemente desea que se normalicen todos los archivos de texto en su repositorio, debe establecer el atributo de texto en "auto" para todos los archivos.

Esto garantiza que todos los archivos que git considera texto tendrán terminaciones de línea normalizadas (LF) en el repositorio.

Dave Zych
fuente
12
¿Qué quieres decir con finalización de línea normalizada?
Fizer Khan
14
When a text file is normalized, its line endings are converted to LF in the repository.
Dave Zych
11
Es importante saber que esto sobrescribe la configuración local core.autocrlf en su máquina. Vea esta gran respuesta de @Daniel Jomphe
spankmaster79
1
Sería muy agradable si git simplemente no hiciera $% # con ninguno de los archivos que se registran en el repositorio. I "He trabajado con el MST, por fuerza, MSBUILD, depósito de la fuente, TFS, SVM, ninguno de ellos va a cambiar ni un solo byte en cualquiera de sus archivos Este es un git insidiosa truco OMI y me ha causado mucho dolor..
Vance McCorkle
1
Lo que sucede en el proceso de pago es solo la mitad de la historia: ¿qué sucede al obtenerlo? ¿Sería correcto decir que al finalizar la compra, las terminaciones de línea permanecen igual LF, incluso en Windows?
Anthony
8

Esa configuración es con respecto a cómo se manejan los finales de línea. Cuando está habilitado, todas las terminaciones de línea se convierten a LF en el repositorio. Hay otros indicadores para tratar cómo se convierten las terminaciones de línea en su directorio de trabajo. La información completa sobre el problema nos aquí: https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html

Karl Zöller
fuente