your working will warning the original not its have error endings crlf git msysgit

git - working - lf vs crlf



¿Cómo fuerzo a git a usar LF en lugar de CR+LF en Windows? (5)

Quiero forzar a git a desproteger archivos en Windows usando solo LF no CR+LF . Revisé las dos opciones de configuración pero no pude encontrar la combinación correcta de configuraciones.

Quiero que convierta todos los archivos a LF y mantenga el LF en los archivos.

Nota: usé autocrlf = input pero esto solo repara los archivos cuando los confirma. Quiero forzarlo para que usen LF .

Probablemente no estaba tan claro: el repositorio ya está usando LF pero los archivos que se comprueban con msysgit están usando CR+LF y quiero forzar a msysgit a que los obtenga con LF : forzando los finales de línea de Unix .

>git config --list | grep crlf core.autocrlf=input


Contexto

Si tu

  1. desea forzar a todos los usuarios a tener terminaciones de línea LF para archivos de texto y
  2. no puedes asegurarte de que todos los usuarios cambien su configuración git,

Puedes hacerlo comenzando con git 2.10. Se requiere 2.10 o posterior, porque 2.10 corrigió el comportamiento de text = auto junto con eol = lf . Source

Solución

Coloque un archivo .gitattributes en la raíz de su repositorio git que tenga los siguientes contenidos:

* text=auto eol=lf

Cometerlo

Ajustes opcionales

También puede agregar un .editorconfig en la raíz de su repositorio para asegurarse de que las herramientas modernas creen nuevos archivos con los finales de línea deseados.

# EditorConfig is awesome: http://EditorConfig.org # top-most EditorConfig file root = true # Unix-style newlines with a newline ending every file [*] end_of_line = lf insert_final_newline = true


El OP agregó en su pregunta:

los archivos extraídos utilizando msysgit utilizan CR+LF y quiero forjar msysgit para obtenerlos con LF

Un primer paso simple todavía estaría en un archivo .gitattributes :

*.txt -crlf

, para evitar cualquier conversión de crlf para archivos con eol correcto.

Consulte Mejores prácticas para git config multiplataforma?

Pero un segundo paso más poderoso implica un controlador de filtro de atributo de gitat y agregar un paso de difuminado

Siempre que actualice su árbol de trabajo, un script podría, solo para los archivos que ha especificado en los .gitattributes , forzar el LF eol y cualquier otra opción de formato que desee aplicar.
Si el script " clear " no hace nada, habrá transformado (después de confirmar) sus archivos, aplicando exactamente el formato que necesita que sigan.


La forma correcta de obtener terminaciones LF en Windows es establecer primero core.autocrlf en false :

git config --global core.autocrlf false

Debe hacer esto si está usando msysgit, porque lo establece en true en la configuración del sistema.

Ahora git no hará ninguna línea que termine la normalización. Si desea que los archivos que registre estén normalizados, haga lo siguiente: Establezca text=auto en sus .gitattributes para todos los archivos:

* text=auto

Y establece core.eol a lf :

git config --global core.eol lf

Ahora también puede cambiar los repositorios individuales a crlf (en el directorio de trabajo) ejecutando

git config core.eol crlf

Después de haber realizado la configuración, es posible que desee que git normalice todos los archivos en el repositorio . Para hacer esto, ve a la raíz de tu repositorio y ejecuta estos comandos:

git rm --cached -rf . git diff --cached --name-only -z | xargs -n 50 -0 git add -f

Si ahora desea que git también normalice los archivos en su directorio de trabajo , ejecute estos comandos:

git ls-files -z | xargs -0 rm git checkout .


Vuelvo a esta respuesta con bastante frecuencia, aunque ninguno de estos es el adecuado para mí. Dicho esto, la respuesta correcta para mí es una mezcla de las otras.

Lo que encuentro funciona es lo siguiente:

git config --global core.eol lf git config --global core.autocrlf input

Para los repositorios que se verificaron después de que se establecieron esas configuraciones globales, todo se verificará como lo que sea que esté en el repositorio, con suerte LF ( /n ). Cualquier CRLF se convertirá a solo LF en el registro.

Con un repositorio existente que ya ha revisado, que tiene los finales de línea correctos en el repositorio pero no su copia de trabajo, puede ejecutar los siguientes comandos para corregirlo:

git rm -rf --cached . git reset --hard HEAD

Esto eliminará ( rm ) recursivamente ( r ) sin preguntar ( -f ), todos los archivos excepto los que haya editado ( --cached ), desde el directorio actual ( . ). El reset luego devuelve todos esos archivos a un estado donde tienen sus finales de línea verdaderos (que coinciden con lo que hay en el repositorio).

Si necesita corregir los finales de línea de los archivos en un repositorio, le recomiendo que tome un editor que le permita hacerlo de forma masiva, como IntelliJ o Sublime Text, pero estoy seguro de que cualquier buena versión lo respaldará.


core.autocrlf=input es la configuración correcta para lo que desea, pero es posible que tenga que hacer un git update-index --refresh y / o git reset --hard para que el cambio surta efecto.

Con core.autocrlf configurado para input , git no aplicará la conversión de nueva línea en el check-out (por lo tanto, si tiene LF en el repositorio, obtendrá LF), pero se asegurará de que en caso de que haga un error y presente algunos Los CRLF en la copia de trabajo de alguna manera, no entrarán en el repositorio.