Windows git "advertencia: LF será reemplazado por CRLF", ¿está esa cola de advertencia al revés?

147

env:

  • Windows 7
  • msysgit

Wheng I git commit, dice:

warning: LF will be replaced by CRLF. 

¿Es esta cola de advertencia hacia atrás?
Edito el archivo en Windows, el final de la línea es CRLF, al igual que esta foto:
ingrese la descripción de la imagen aquí
Y git lo cambia LFpor comprometerse con el repositorio.
Entonces creo que la advertencia correcta es:

warning: CRLF will be replaced by LF. 
Honghe.Wu
fuente
2
@devnull Quiero decir que la advertencia es cola hacia atrás, ¿verdad?
Honghe.Wu
@ Honghe.Wu No, no está en Windows. He editado mi respuesta a continuación
VonC
11
Gran pregunta porque de hecho, la advertencia parece ser al revés. Es realmente confuso recibir esta advertencia sobre la conversión a CRLF en una confirmación y no será útil explicar el manejo de espacios en blanco de Git, porque la advertencia es al revés .
Stijn de Witt
1
@StijndeWitt Me encantaría verte comentar como respuesta para votarlo.
user1460043

Respuestas:

185

advertencia: LF será reemplazado por CRLF.

Dependiendo del editor que esté utilizando, un archivo de texto con LF no necesariamente se guardará con CRLF: los editores recientes pueden preservar el estilo EOL. Pero esa configuración de git insiste en cambiar esos ...

Simplemente asegúrese de que (como recomiendo aquí ):

git config --global core.autocrlf false

De esa manera, evita cualquier transformación automática y aún puede especificarlos a través de un .gitattributesarchivo y core.eoldirectivas .


Windows git "LF será reemplazado por CRLF"
¿Esta advertencia está hacia atrás?

No: estás en Windows, y la git configpágina de ayuda menciona

Utilice esta configuración si desea tener CRLFterminaciones de línea en su directorio de trabajo aunque el repositorio no tenga terminaciones de línea normalizadas.

Como se describe en " git reemplazando LF por CRLF ", solo debería ocurrir al finalizar la compra (no commit), con core.autocrlf=true.

       repo
    /        \ 
crlf->lf    lf->crlf 
 /              \    

Como se menciona en la respuesta de XiaoPeng , esa advertencia es la misma que:

advertencia: (si lo revisa o clona en otra carpeta con su core.autocrlfconfiguración actual ), LF será reemplazado por CRLF
El archivo tendrá sus terminaciones de línea originales en su directorio de trabajo (actual).

Como se menciona en el git-for-windows/gitnúmero 1242 :

Todavía siento que este mensaje es confuso, el mensaje podría extenderse para incluir una mejor explicación del problema, por ejemplo: "LF será reemplazado por CRLF file.jsondespués de eliminar el archivo y volver a revisarlo".

Nota: Git 2.19 (septiembre de 2018), cuando se usa core.autocrlf, la advertencia falsa "LF será reemplazado por CRLF" ahora se suprime .


Como quaylar comenta correctamente , si hay una conversión en commit, es LFsolo.

Esa advertencia específica " LF will be replaced by CRLF" proviene de convert.c # check_safe_crlf () :

if (checksafe == SAFE_CRLF_WARN)
  warning("LF will be replaced by CRLF in %s.
           The file will have its original line endings 
           in your working directory.", path);
else /* i.e. SAFE_CRLF_FAIL */
  die("LF would be replaced by CRLF in %s", path);

Es llamado por convert.c#crlf_to_git(), llamado por convert.c#convert_to_git()sí mismo, llamado por sí mismo convert.c#renormalize_buffer().

Y eso último renormalize_buffer()solo es llamado por merge-recursive.c#blob_unchanged().

Por lo tanto, sospecho que esta conversión se produce git commitsolo si dicha confirmación es parte de un proceso de fusión.


Nota: con Git 2.17 (Q2 2018), una limpieza de código agrega alguna explicación.

Ver commit 8462ff4 (13 de enero de 2018) por Torsten Bögershausen ( tboegi) .
(Fusionada por Junio ​​C Hamano - gitster- en commit 9bc89b1 , 13 feb 2018)

convert_to_git (): safe_crlf / checksafe se convierte en int conv_flags

Al llamar convert_to_git(), el checksafeparámetro definió lo que debería suceder si la conversión EOL ( CRLF --> LF --> CRLF) no se realiza de manera sencilla.
Además, también definió si las terminaciones de línea deben renormalizarse ( CRLF --> LF) o mantenerse como están.

checksafe fue una safe_crlfenumeración con estos valores:

SAFE_CRLF_FALSE:       do nothing in case of EOL roundtrip errors
SAFE_CRLF_FAIL:        die in case of EOL roundtrip errors
SAFE_CRLF_WARN:        print a warning in case of EOL roundtrip errors
SAFE_CRLF_RENORMALIZE: change CRLF to LF
SAFE_CRLF_KEEP_CRLF:   keep all line endings as they are

Tenga en cuenta que una regresión introducida en 8462ff4 (" convert_to_git(): safe_crlf/checksafeconvierte int conv_flags", 13/01/2018, Git 2.17.0) en el ciclo Git 2.17 provocó que las autocrlfreescrituras produjeran un mensaje de advertencia a pesar de la configuraciónsafecrlf=false .

Ver commit 6cb0912 (04 de junio de 2018) por Anthony Sottile ( asottile) .
(Fusionada por Junio ​​C Hamano - gitster- en commit 8063ff9 , 28 jun 2018)

VonC
fuente
1
Sí, la mayoría de los editores pueden conservar el estilo EOL, pero con la mayoría de los editores, eso no tiene ningún efecto al crear un nuevo archivo en el mismo proyecto. Asegúrese de no pagar un proyecto LF, piense "psh, mi editor puede manejar terminaciones de línea LF, no necesito autocrlf", y luego olvide configurar manualmente nuevos archivos en terminaciones de línea LF.
15
@VonC Debo confesar que no lo entiendo. El Git-Book dice que Git puede manejar esto mediante la conversión automática de terminaciones de línea CRLF en LF cuando se compromete, y viceversa cuando se desprotege el código en su sistema de archivos. Esto significa que en commit habrá una conversión a LF y nunca a CRLF . Lo que significa que la advertencia mencionada es incorrecta. Tener core.autocrlf=trueserá siempre ceder en LF en el repositorio, y en mi humilde opinión CRLF en el árbol de trabajo (incluso bajo no es de Windows). Fuente: enlace
quaylar
12
"¿Esta cola de advertencia está hacia atrás? Solo debería ocurrir al finalizar la compra" Estoy viendo esta advertencia exacta al confirmar . Entonces , está al revés. Estar al revés me provocó la búsqueda de esto. ¡Me alegra que otros también lo hayan notado! Es muy confuso para las personas que realmente leen estas advertencias ver que dice que se convertirá a CRLF en un mensaje de confirmación.
Stijn de Witt
77
"Por lo tanto, sospecho que esta conversión ocurre en un git commit solo si dicho commit es parte de un proceso de fusión". No Estoy viendo esto en commits regulares.
Stijn de Witt
3
La parte que me molesta sobre el mensaje es que aparece en absoluto. ¿Por qué necesito que me adviertan que git está a punto de hacer exactamente lo que lo configuré? No necesito una advertencia que diga "hey, todavía estamos convirtiendo terminaciones de línea para usted, como nos pidió". Cuando el sistema se comporta por diseño, no debería dar advertencias innecesarias, o la gente se perderá las advertencias importantes en un mar de mensajes irrelevantes.
Brent Larsen
27

SÍ, la advertencia es al revés.

Y, de hecho, ni siquiera debería ser una advertencia en primer lugar. Porque toda esta advertencia dice (pero desafortunadamente al revés) es que los caracteres CRLF en su archivo con terminaciones de línea de Windows serán reemplazados por LF en la confirmación. Lo que significa que está normalizado a las mismas terminaciones de línea utilizadas por * nix y MacOS.

No pasa nada extraño, este es exactamente el comportamiento que normalmente desearía.

Esta advertencia en su forma actual es una de dos cosas:

  1. Un error desafortunado combinado con un mensaje de advertencia demasiado cauteloso, o
  2. Una trama muy inteligente para hacerte pensar realmente esto ...

;)

Stijn de Witt
fuente
1
Lo extraño es que si convierte por la fuerza archivos locales en Windows a LF, ni siquiera puede agregar los archivos, el mensaje se queja y anula su confirmación.
phpguru
24

- Actualización el 9 de julio ---

Se eliminó "Es correcto y preciso" como comentó @mgiuca

======

NO . NO está hablando de sus archivos actualmente con CRLF. En cambio, se trata de archivos con LF.

Debería leer:

advertencia: ( si lo revisa o clona en otra carpeta con su configuración core.autocrlf actual ), LF será reemplazado por CRLF

El archivo tendrá sus terminaciones de línea originales en su directorio de trabajo ( actual ).

Esta imagen debería explicar lo que significa. ingrese la descripción de la imagen aquí

Xiao Peng - ZenUML.com
fuente
1
Buena ilustración +1. He hecho referencia a su respuesta en la mía para mayor visibilidad.
VonC
Lo que funciona bien para mí es: 1) core.autocrlf = false 2) en Intellij set Line separator (\ n). Yo uso Intellij Idea en Mac y Windows.
Xiao Peng - ZenUML.com
Esto puede suceder cuando el archivo se creó en Windows pero tiene un final de línea unix / mac (lf) y su propiedad de configuración git autocrlf es verdadera. Esencialmente, git no va a cambiar el archivo que creó, pero lo comprobará / clonará con terminaciones de línea de Windows (debido a su configuración de autocrlf)
Patrick
1
¿Cómo es correcta y precisa la advertencia si tiene que calificarla con "Si la revisa o clona en otra carpeta con su configuración actual core.autocrlf"? Eso no es lo que dice el mensaje original. Dice que SERÁ (no podría) ser reemplazado por CRLF, lo que implica que se almacenará en modo CRLF en el repositorio en sí, no en un pago hipotético futuro.
mgiuca
12

Todo esto supone core.autocrlf=true

Error original:

advertencia: LF será reemplazado por CRLF
El archivo tendrá sus terminaciones de línea originales en su directorio de trabajo.

Lo que DEBE leer el error:

advertencia: LF será reemplazado por CRLF en su directorio de trabajo
El archivo tendrá sus terminaciones de línea LF originales en el repositorio git

Explicación aquí :

El efecto secundario de esta conveniente conversión, y de esto se trata la advertencia que está viendo, es que si un archivo de texto que creó originalmente tenía terminaciones LF en lugar de CRLF, se almacenará con LF como de costumbre, pero cuando se verifica más tarde tendrá terminaciones CRLF. Para archivos de texto normales, esto suele estar bien. La advertencia es un "para su información" en este caso, pero en caso de que git evalúe incorrectamente que un archivo binario sea un archivo de texto, es una advertencia importante porque git estaría corrompiendo su archivo binario.

Básicamente, un archivo local que anteriormente era LF ahora tendrá CRLF localmente

Mike
fuente
7

git config --global core.autocrlf false funciona bien para configuraciones globales.

Pero si está utilizando Visual Studio, es posible que también deba modificar .gitattributesalgún tipo de proyecto ( por ejemplo, la aplicación de biblioteca de clase c # ):

  • eliminar línea * text=auto
Eric Wang
fuente
1

Después de configurar core.autocrlf=true, estaba obteniendo "LF será reemplazado por CRLF" (nota no "CRLF será reemplazado por LF") cuando estaba editando git add(¿o tal vez estaba encendido git commit?) Archivos editados en Windows en un repositorio (que sí usa LF) que se verificó antes de configurar core.autocrlf=true.

Hice un nuevo pago con core.autocrlf=truey ahora no recibo esos mensajes.

Marsette Vona
fuente
0

Si está utilizando Visual Studio 2017, 2019, puede:

  1. abra el .gitignore principal (actualice o elimine otros archivos .gitignore en otros proyectos de la solución)
  2. pegue el siguiente código:
[core]
 autocrlf = false
[filter "lfs"]
 required = true
 clean = git-lfs clean -- %f
 smudge = git-lfs smudge -- %f
 process = git-lfs filter-process
Javier Cañon
fuente
1
Parece que ese "código" debería estar en un archivo de configuración como .gitconfigo .git/config, no .gitignore, que especifica los archivos que git debe ignorar.
davidA
Agregué esto a .git / config pero aún aparece "advertencia: CRLF será reemplazado por LF"
Sergei
0

Haz una cosa simple:

  1. Abra git-hub (Shell) y navegue hasta el archivo de directorio al que pertenece (cd / a / b / c / ...)
  2. Ejecute dos2unix (a veces dos2unix.exe)
  3. Intenta comprometerte ahora. Si obtiene el mismo error nuevamente. Realice todos los pasos anteriores, excepto en lugar de dos2unix, haga unix2dox (unix2dos.exe en algún momento)
Antriksh Jain
fuente