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
- desea forzar a todos los usuarios a tener terminaciones de línea LF para archivos de texto y
- 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 conLF
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.