Git con autocrlf=true desprotege los archivos con finales de línea mixtos tal cual

4 minutos de lectura

avatar de usuario
SDDS

Entonces, siempre pensé que con core.autocrlf=true Git reemplaza todo LF termina con CRLF al retirar el archivo en el directorio de trabajo.

Desde el libro:

Si está en una máquina con Windows, configúrelo en verdadero: esto convierte las terminaciones LF en CRLF cuando revisa el código

Sin embargo, al extraer un archivo con finales de línea mixtos y core.autocrlf ajustado a truemi versión de Git desprotege el archivo tal como está.

Encontré un repositorio de GitHub muy conveniente para probar este comportamiento: https://github.com/YueLinHo/TestAutoCrlf

Resultados de la prueba:

  • un archivo con LF solo terminaciones (LF.txt)
    • Con autocrlf=false: desprotegido tal cual (todas las terminaciones de línea son LF)
    • Con autocrlf=true: todos los finales de línea se cambian a CRLF al pagar

Hasta ahora todo bien, todo como esperaba. Ahora para el archivo con finales de línea mixtos:

  • Un archivo con finales de línea mixtos (MIX-more_CRLF.txt, MIX-more_LF.txt)
    • Con autocrlf=false: desprotegido tal cual (una mezcla de LF y CRLF)
    • Con autocrlf=true: desprotegido tal cual (una mezcla de LF y CRLF)

¿Por qué pasó esto? no he visto nada sobre autocrlf=true no tocar archivos con finales de línea mixtos.

¿Mi configuración de Git tiene la culpa? revisé el core.autocrlf corriendo git config --get core.autocrlf en la carpeta del repositorio después de verificar con autocrlf=true en el .gitconfig global, y el comando devolvió verdadero. No hay un archivo .gitattributes para sobrescribir la configuración.

Todas las pruebas se realizaron en la versión Git. 1.9.5.msysgit.0.

EDITAR: Mismo comportamiento en la última versión de msysgit 1.9.5.msysgit.1.

Mi problema original es que de alguna manera logré enviar un archivo final de línea mixta con solo LF terminaciones teniendo core.autocrlf ajustado a truelo que significa que el archivo se desprotegió tal cual, pero se comprometió con CRLF cambiado a LF. Actualmente estoy trabajando desde otra máquina y no puedo reproducir este comportamiento en mi versión de msysgit.

  • En realidad, suena como un buen valor predeterminado; si un archivo tiene finales de línea mixtos, probablemente haya una buena razón para ello en situaciones generales. La solución obvia es convertir el archivo a los finales de línea predeterminados del sistema y luego confirmarlo, lo que permite que git convierta los finales de línea.

    – Microvirus

    22 de abril de 2015 a las 9:46

  • @MicroVirus Tal vez sea un buen valor predeterminado, pero no he visto este comportamiento documentado en ninguna parte, así que me preguntaba por qué sucede.

    – sdds

    22 de abril de 2015 a las 10:18

Estoy volviendo a publicar una respuesta que fue eliminada por su propietario, porque creo que da la mejor explicación. No tengo idea de por qué el autor lo eliminó, creo que es correcto y he votado para recuperarlo.

Aparentemente, este comportamiento está codificado en Git y no depende de core.safecrlf (y lo probé, los archivos mixtos se dejan intactos incluso si configuro git config core.safecrlf false.

La respuesta original sigue:


Autocrlf no convertir finales de línea mixtos, como dice el código fuente de git:

https://github.com/git/git/commit/a0ad53c18100226cb1a138cb9b3bc3615170be8f

Tenga en cuenta los comentarios aquí:

/* No "naked" LF? Nothing to convert, regardless. */

y

/* If we have any CR or CRLF line endings, we do not touch it */
/* This is the new safer autocrlf-handling */

La conversión de finales de línea mixtos no es reversible; cuando termina, Git falla.

Por lo tanto, si desea convertir automáticamente los finales de línea de sus archivos, podría ser una buena idea establecer un .gitattributes archivo relacionado con el fin de línea. Tal como:

LF.txt eol=lf
CRLF.txt eol=crlf

avatar de usuario
xdazz

¿Cuál es el valor de core.safecrlf ?

Si core.safecrlf se establece en true, los archivos de finales de línea mixtos no se convertirán. (Porque la conversión no es reversible si se mezclan los finales de línea)

  • git config --get core.safecrlf en la carpeta del repositorio devuelve una línea vacía, así que supongo que no está configurada.

    – sdds

    22 de abril de 2015 a las 10:14

  • Entonces, tal vez su valor predeterminado sea verdadero.

    – xdazz

    22 de abril de 2015 a las 11:07


  • Pero core.safecrlf=true no me dejaría enviar un archivo con finales de línea mixtos si se realiza alguna conversión. warn me avisaria. En cambio, no recibo ningún mensaje en tal compromiso, incluso si configuro explícitamente core.safecrlf para true.

    – sdds

    22 de abril de 2015 a las 11:38


  • @MicroVirus Sí, eso es todo.

    – xdazz

    22 de abril de 2015 a las 12:56

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad