git commit obtiene el error fatal "fatal: CRLF sería reemplazado por LF in"

84

Estoy usando Ubuntu 13.10 x64, y estoy trabajando en un proyecto en el que algunos desarrolladores están usando Windows, recientemente cambié la configuración de git core.eola "lf" y core.autocrlfa "input" y core.safecrlfa "true". Desde entonces, cuando intento enviar un archivo a mi repositorio local, aparece este error: por
fatal: CRLF would be replaced by LF in ......
lo que entiendo, si configuro core.eol"lf" y core.autocrlf"input", git convertirá automáticamente CRLF a LF, pero ¿por qué aparece este error? ¿afuera? ¿Como puedo solucionar este problema?

Gracias.

aserww106
fuente

Respuestas:

220

Este es un problema clásico:

http://toub.es/sites/toub.es/files/styles/standard_article/public/field/image/firstcommit.png
(imagen de la publicación del blog de Luis Tubes )

La solución habitual es convertir esos archivos usted mismo, con dos2unix o Swiss File Knife .

Siempre he preferido mantener core.autocrlfafalse , lo que significa:

git config --global core.autocrlf false
VonC
fuente
Ese mensaje de error incluso se arrastra en la git diffsalida: git.661346.n2.nabble.com/...
VonC
8
¿Por qué git no puede cambiar CRLF a LF si ya lo configuré core.autocrlfpara ingresar?
aserww106
1
@William porque está trabajando en Linux y con archivos que provienen de Windows.
VonC
Gracias, @VonC, ya uso dos2unix para cambiar todos los archivos eol, así que cuando los desarrolladores de Windows envíen algún código a su repositorio, si lo extraigo de su repositorio, git convertirá CRLF a LF, ¿verdad? Nuestro servidor git está en Ubuntu.
aserww106
1
@William Quiero decir que dijiste "Recientemente cambié el git config core.eola" lf"ya core.autocrlf" input"": eso no cambia los archivos que ya están allí. Eso tendría un impacto en el futuro git pull. Los archivos actuales todavía están en CRLF y, si se modifican, se convierten a LF si es posible y, de lo contrario, se activa el mensaje de error que menciona.
VonC
55

Tuve el mismo problema y probé la solución sugerida sin éxito.

Tuve que ejecutar un segundo comando para que funcionara:

$ git config --global core.autocrlf false
$ git config --global core.safecrlf false
almo
fuente
5
¿Hay alguna ramificación negativa de esta edición adicional?
AlleyOOP
¡Gracias Señor! Ayudándome en 2020 :)
Joe Spinelli
28
$ git config core.autocrlf false
Arun
fuente
3
No sé qué hace esto, pero funciona. La advertencia fatal se va y ya no tengo miedo.
wh1tney
Hice esto y ahora git diffveo todo mi archivo (1000 líneas) como un conflicto. Las herramientas de diferencias solo ven 3 cambios de línea.
Dagrooms
10

Uno puede simplemente probar dos2unix:

dos2unix [filename]
Yola
fuente
4

Esto me sucedió en miles de archivos. Así que escribí un script bash rápido para dos2unixarreglarlo por mí. Alguien más en Linux o Mac podría encontrarlo útil.

#!/usr/bin/env bash

unwindows() {

  local errmsg
  local fpath

  # base case
  errmsg="$(git add . 2>&1)"
  if [[ $? -eq 0 ]]; then
    echo 'Successfully converted CRLF to LF in all files.'
    echo 'Successfully ran "git add .".'
    echo 'Done.'
    return 0
  fi

  fpath="${errmsg#*fatal: CRLF would be replaced by LF in }"
  fpath="${fpath%.*}"

  if [[ "${fpath}" == "${errmsg}" ]]; then
    err 'Regex failed. Could not auto-generate filename from stderr.'
    return 1
  fi

  if [[ ! -e "${fpath}" ]]; then
    err "Regex failed. '${fpath}' does not exist."
    return 1
  fi

  if ! dos2unix "${fpath}"; then
    err "Failed to run \"dos2unix '${fpath}'\"."
    return 1
  fi

  # recursive case
  unwindows
}

err() {
  local -r msg="$1"
  echo "${msg}" >&2
}

unwindows

Básicamente, intenta hacerlo git add .. Si el comando falla, toma el nombre del archivo incompatible de la salida del error. Luego se ejecuta dos2unixen ese archivo. Sigue repitiendo este proceso hasta que git add .funciona.

Si ejecuta esto, debería ver dos2unix: converting file xxx to Unix format...repetidamente. Si no lo hace, no funciona, así que presione ctrl+ co command+ cpara detenerlo.

Mapache Verde23
fuente
2
En caso de que alguien tenga curiosidad por saber cómo logré acumular miles de archivos no confirmados, es porque el repositorio tiene un montón de imágenes generadas por código. No estaba posponiendo un compromiso por 3 años ni nada.
GreenRaccoon23
1

Debe agregar todos los archivos que se git statusmuestran como modificados:

git add file1
git add file2

Y luego confirma tus cambios:

git commit

Esto mantendrá sus archivos locales como están, pero estarán autocrlfen el repositorio remoto.

Karl.S
fuente
1

Enfrenté el mismo problema y lo arreglé con la edición .gitattributescomo se muestra a continuación.

$ vim .gitattributes

comentar 2 líneas en .gitattributes

-* text=auto
-* text eol=lf
+# * text=auto
+# * text eol=lf
Kazma Arakaki
fuente
1

Para su información, no estoy seguro de si esto se aplica a usted, pero recibí este error al intentar agregar accidentalmente todos node_moduleslos cambios por etapas. Así que en realidad .gitignoringel node_modulesresuelto mi problema.

Nickofthyme
fuente
0

Estoy en una Mac usando Terminal y tuve este problema con un archivo .htaccess que estaba tratando de confirmar, obteniendo el error fatal:

fatal: CRLF would be replaced by LF in .htaccess

Quería solucionar el problema, como las solicitudes de OP, no solo desactivar un indicador de git, así que encontré este artículo que proporciona un comando de perl para solucionar el problema por archivo.

perl -pi -e 's/\r\n/\n/g' input.file

Entonces, para mi error .htaccess anterior, ejecuté lo siguiente:

perl -pi -e 's/\r\n/\n/g' .htaccess 

Los indicadores -p, -i y -e (pie) se pueden combinar para permitirle editar archivos usando Perl desde la línea de comando. En este caso reemplazando todo \ r \ n encontrado con \ n.

thetwopct
fuente