git commit obtient l'erreur fatale "fatal: CRLF serait remplacé par LF in"

84

J'utilise Ubuntu 13.10 x64, et je travaille sur un projet que certains développeurs utilisent Windows, j'ai récemment changé la configuration de git core.eolen "lf" et core.autocrlfen "input" et core.safecrlfen "true". Depuis lors, lorsque j'essaye de valider le fichier dans mon référentiel local, j'obtiens cette erreur:
fatal: CRLF would be replaced by LF in ......
D'après ce que je comprends, si je mets core.eolà "lf" et core.autocrlfà "input", git convertira automatiquement CRLF en LF, mais pourquoi cette erreur vient en dehors? Comment puis-je résoudre ce problème?

Merci.

aserww106
la source

Réponses:

220

C'est un problème classique:

http://toub.es/sites/toub.es/files/styles/standard_article/public/field/image/firstcommit.png
(photo de Luis Tubes de blog )

La solution habituelle est de convertir ces fichiers vous-même, avec dos2unix ou Swiss File Knife .

J'ai toujours préféré garder core.autocrlfàfalse , ce qui signifie:

git config --global core.autocrlf false
VonC
la source
Ce message d'erreur se glisse même dans la git diffsortie: git.661346.n2.nabble.com
...
8
Pourquoi git ne peut pas changer CRLF en LF pour moi si je suis déjà défini core.autocrlfsur input?
aserww106
1
@William parce que vous travaillez sous Linux, et avec des fichiers provenant de Windows.
VonC
Merci, @VonC, j'utilise déjà dos2unix pour changer tous les fichiers eol, donc quand les développeurs Windows commettent du code dans leur dépôt, si je tire de leur dépôt, git convertira CRLF en LF, non? Notre serveur git est sur Ubuntu.
aserww106
1
@William Je veux dire que vous avez dit "J'ai récemment changé le git config core.eol" lf"et core.autocrlf" input"": cela ne change pas les fichiers déjà là. Cela aurait un impact sur l'avenir git pull. Les fichiers actuels sont toujours dans CRLF, et s'ils sont modifiés, sont convertis en LF si possible et, sinon, déclenche le message d'erreur que vous mentionnez.
VonC
55

J'ai eu le même problème et j'ai essayé la solution suggérée sans succès.

J'ai dû exécuter une deuxième commande pour que cela fonctionne:

$ git config --global core.autocrlf false
$ git config --global core.safecrlf false
almo
la source
5
y a-t-il des ramifications négatives à cette modification supplémentaire?
AlleyOOP
Merci Monsieur! Aidez-moi en 2020 :)
Joe Spinelli
28
$ git config core.autocrlf false
Arun
la source
3
Je ne sais pas ce que ça fait mais ça marche. L'avertissement fatal disparaît et je n'ai plus peur.
wh1tney
J'ai fait cela et git diffconsidère maintenant mon fichier entier (1000 lignes) comme un conflit. Les outils de diff ne voient que 3 changements de ligne.
Dagrooms le
10

On peut juste essayer dos2unix:

dos2unix [filename]
Yola
la source
4

Cela m'est arrivé sur des milliers de fichiers. J'ai donc écrit un script de bash rapide pour le dos2unixréparer pour moi. Quelqu'un d'autre sur Linux ou Mac pourrait le trouver utile.

#!/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

En gros, il essaie de faire git add .. Si la commande échoue, elle récupère le nom du fichier incompatible de la sortie d'erreur. Ensuite, il s'exécute dos2unixsur ce fichier. Il répète ce processus jusqu'à ce qu'il git add .fonctionne.

Si vous exécutez ceci, vous devriez voir à dos2unix: converting file xxx to Unix format...plusieurs reprises. Si vous ne le faites pas, cela ne fonctionne pas, alors appuyez simplement sur ctrl+ cou command+ cpour l'arrêter.

Vert Raton Laveur23
la source
2
Au cas où quelqu'un serait curieux de savoir comment j'ai réussi à accumuler des milliers de fichiers non validés, c'est parce que le dépôt contient un tas d'images générées par du code. Je n'ai pas reporté un engagement de 3 ans ou quoi que ce soit.
GreenRaccoon23
1

Vous devez ajouter tous les fichiers qui git statuss'affichent comme modifiés:

git add file1
git add file2

Et puis validez vos modifications:

git commit

Cela conservera vos fichiers locaux tels quels, mais autocrlfles conservera sur le référentiel distant.

Karl.S
la source
1

J'ai rencontré le même problème et j'ai corrigé l'édition .gitattributescomme ci-dessous.

$ vim .gitattributes

commenter 2 lignes dans .gitattributes

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

Pour info, je ne sais pas si cela s'applique à vous, mais j'obtenais cette erreur en essayant accidentellement de tout ajouter node_modulesaux modifications par étapes. Donc en fait .gitignoringle node_modulesrésoudre mon problème.

Nickofthyme
la source
0

Je suis sur un Mac utilisant Terminal et j'ai eu ce problème avec un fichier .htaccess que j'essayais de commettre, obtenant l'erreur fatale:

fatal: CRLF would be replaced by LF in .htaccess

Je voulais résoudre le problème, comme les requêtes OP, pas seulement désactiver un indicateur git, j'ai donc trouvé cet article qui donne une commande perl pour résoudre le problème par fichier.

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

Donc, pour mon erreur .htaccess ci-dessus, j'ai exécuté ce qui suit:

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

Les indicateurs -p, -i et -e (pie) peuvent être combinés pour vous permettre d'éditer des fichiers en utilisant Perl à partir de la ligne de commande. Dans ce cas, remplacer tout \ r \ n trouvé par \ n.

thetwopct
la source