¿Cómo obligo a git a usar LF en lugar de CR + LF en Windows?

9 minutos de lectura

[*]
sorín

Quiero forzar a git a retirar 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 mantener el LF en los archivos.

Observación: yo usé autocrlf = input pero esto solo repara los archivos cuando los envía. Quiero forzarlo para que usen LF.

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

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

  • autocrlf=input es la opción correcta. Por supuesto, no lo protege de los archivos que realmente tienen cr+lf en el repositorio o creando archivos con cr+lf en otra herramienta antes de agregarlos a git. ¿Qué problemas tienes para los que esto no funciona?

    –CB Bailey

    25 de marzo de 2010 a las 16:10

  • Los archivos en el repositorio ya están usando solo LF pero cuando los obtengo en Windows, msysgit los convierte a CR+LF.

    – sorin

    25 de marzo de 2010 a las 16:19

  • Debe haber algo con su configuración; Acabo de probar esto en mi instalación de msysgit. Con autocrlf ajustado a inputgit se va lf saltos de línea solos. ¿Puedes publicar la salida de git config?

    –CB Bailey

    25 de marzo de 2010 a las 22:46

  • En ese caso, le sugiero que registre un error; preferiblemente apuntando a un repositorio de prueba que muestre su problema e incluya pasos para reproducir, ya que el comportamiento que está viendo es definitivamente incorrecto (pero no puedo reproducirlo).

    –CB Bailey

    26 de marzo de 2010 a las 11:14

  • Un pequeño consejo es también asegurarse de que está ejecutando los comandos de git en el ‘git’ que cree que es. Por ejemplo, puede tener git instalado en Windows y git instalado en cygwin, así que asegúrese de haber configurado la configuración de git correcta.

    – lfred

    26 de marzo de 2015 a las 10:37

¿Como obligo a git a usar LF en lugar de
Cronial

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

git config --global core.autocrlf false

Debe hacer esto si está utilizando msysgit, porque lo establece en true en la configuración de su sistema.

Ahora git no hará ninguna normalización de final de línea. Si desea que los archivos que registre se normalicen, haga lo siguiente: Establecer text=auto en tus .gitattributes para todos los archivos:

* text=auto

Y establecer core.eol para lf:

git config --global core.eol lf

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

git config core.eol crlf

Una vez que haya realizado la configuración, es posible que desee que git normalice todos los archivos en el repositorio. Para hacer esto, vaya a la raíz de su repositorio y ejecute 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 trabajoejecute estos comandos:

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

  • Recibo fatal pathspec ” no coincidió con ningún archivo, justo después git diff --cached --name-only -z | xargs -0 git add

    – CMC Dragonkai

    18 de marzo de 2014 a las 16:58


  • cual es la salida de git diff --cached --name-only?

    – Cronial

    18 de marzo de 2014 a las 22:29

  • Vale la pena mencionar que puede establecer esta configuración tiempo clonar el repositorio en cuestión, por ejemplo git clone --config core.autocrlf=false <repo path>.

    – Chris largo

    1 de abril de 2020 a las 19:03

  • Obtuve esta respuesta porque mi WebStorm/PHPStorm convirtió los finales de línea de LF a CRLF cada vez que hago clic en git “Rollback…” en un archivo. Después de esta acción, todo el archivo estaba en rojo porque ESLint subraya cada línea debido a un final incorrecto. Un par de comandos resolvieron mi problema: git config --global core.autocrlf false y git config --global core.eol lf. ¡Gracias!

    –Eugène Karataev

    17 de diciembre de 2020 a las 3:37


  • usted señor, es un genio

    – Omeriko

    27 de agosto de 2021 a las 20:58

1646960470 535 ¿Como obligo a git a usar LF en lugar de
Ben Liyanage

Vuelvo a esta respuesta con bastante frecuencia, aunque ninguna de ellas es adecuada para mí. Dicho esto, la respuesta correcta para mí es una mezcla de las demás.

Lo que encuentro que funciona es lo siguiente:

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

Para los repositorios que se desprotegieron después de establecer la configuración global, todo se verificará como sea que esté en el repositorio, con suerte. LF (\n). Ninguna CRLF se convertirá en sólo LF en el registro

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

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

Esto eliminará (rm) recursivamente (r) sin aviso (-f), todos los archivos excepto los que haya editado (--cached), desde el directorio actual (.). los reset luego devuelve todos esos archivos a un estado en el que tienen sus verdaderos finales de línea (coincidiendo con lo que está 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 cualquiera que sea bueno probablemente lo admita.

  • Tenemos un solo repositorio con subdirectorios que requieren un manejo diferente de finales de línea. Entonces, establecer una opción global no funciona para esto. Ni siquiera en el repositorio único. ¿Cómo se aplican estas mismas configuraciones en .gitattributes?

    – RobG

    13 de febrero de 2016 a las 18:43

  • Notepad++ también muestra el final de línea del archivo abierto actualmente en la esquina inferior derecha. Un clic derecho en ese campo le permitirá cambiar los finales de línea.

    – winklerrr

    6 de julio de 2018 a las 12:02

  • los core.autocrlf input opción anula la core.eol configuración, por lo que configurar ambos es redundante. (Ver git-scm.com/docs/git-config)

    – Andrés Marshall

    2 de enero de 2020 a las 13:27

  • Gracias, con tu ayuda he conquistado lint y Linux. Y ahora puede registrar archivos.

    – GC_

    4 de abril de 2020 a las 18:58


  • Creo que el autor estableció core.eol porque en algunos casos algunos editores u otras aplicaciones pueden anular core.autocrlf valor, por lo que esta configuración se utiliza como una copia de seguridad.

    – ttimasdf

    18 de enero a las 13:54


¿Como obligo a git a usar LF en lugar de
VonC

El OP agregó en su pregunta:

los archivos desprotegidos usando msysgit están usando CR+LF y quiero obligar a msysgit a obtenerlos con LF

Un primer paso simple sería todavía en un .gitattributes expediente:

# 2010
*.txt -crlf

# 2020
*.txt text eol=lf 

(como se señaló en los comentarios del nieto, refiriéndose a .gitattributes Conversión de fin de línea), para evitar cualquier CRLF conversión para archivos con correcto eol.

Y siempre he recomendado git config --global core.autocrlf false para deshabilitar cualquier conversión (que se aplicaría a todos archivos versionados)

Ver ¿Las mejores prácticas para la configuración de git multiplataforma?

Desde Git 2.16 (Q1 2018), puede usar git add --renormalize . para aplicar esos .gitattributes ajustes inmediatamente.


Pero un segundo paso más poderoso implica una controlador de filtro gitattribute y agrega un paso de difuminado

controlador de filtro

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

  • Una pregunta: *.txt se refiere a todos los archivos con extensión .txt oa todos los archivos de texto (no binarios)? No puedo hacer una lista con todos los tipos de extensión de archivo que tendré en el proyecto.

    – sorin

    26 de marzo de 2010 a las 11:09

  • @Sorin: todos los archivos con .txt extensión. Es preferible establecer primero esto y probarlo en un grupo específico, antes de generalizar a *, y agregar una regla negativa !*.xyz ... para excluir algunos archivos de esa regla.

    – VoC

    26 de marzo de 2010 a las 12:24

  • Por ahora el .gitattributes las líneas deben leer: *.txt text eol=lf según git-scm.com/docs/gitattributes

    – nieto

    9 de enero de 2020 a las 16:41

  • @grandchild Gracias. He incluido tu comentario en la respuesta para mayor visibilidad.

    – VoC

    9 de enero de 2020 a las 21:22

  • Supongo que después de agregar .gitattributes Tenemos que hacer git add --renormalize .

    – KRoy

    25 de mayo de 2020 a las 20:04

1646960472 185 ¿Como obligo a git a usar LF en lugar de
koppor

Contexto

Si usted

  1. quiere obligar a todos los usuarios a tener terminaciones de línea LF para archivos de texto y
  2. no puede asegurarse de que todos los usuarios cambien su configuración de 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. Fuente.

Solución

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

* text=auto eol=lf

Comprométete.

Ajustes opcionales

También puede agregar un .editorconfig en la raíz de su repositorio para garantizar 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

1646960473 215 ¿Como obligo a git a usar LF en lugar de
kusma

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

Con core.autocrlf ajustado a inputgit no aplicará la conversión de nueva línea en el check-out (por lo que si tiene LF en el repositorio, obtendrá LF), pero se asegurará de que, en caso de que se equivoque e introduzca algunos CRLF en la copia de trabajo de alguna manera, no llegarán al repositorio.

  • Los comandos deben ser git rm –cached -r . && git reset –difícil

    – koppor

    1 de enero de 2013 a las 21:39


1646960473 401 ¿Como obligo a git a usar LF en lugar de
c-santana

Puedes encontrar la solución a este problema en:
https://help.github.com/en/github/using-git/configuring-git-to-handle-line-endings

Descripción simplificada de cómo puede resolver este problema en Windows:

Configuración global para finales de línea El comando git config core.autocrlf se usa para cambiar la forma en que Git maneja los finales de línea. Se necesita un solo argumento.

En Windows, simplemente pasa verdadero a la configuración. Por ejemplo: C:>git config –global core.autocrlf true

Buena suerte, espero haber ayudado.

  • Los comandos deben ser git rm –cached -r . && git reset –difícil

    – koppor

    1 de enero de 2013 a las 21:39


¿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