web-dev-qa-db-fra.com

git commit get fatal error "fatal: CRLF serait remplacé par LF dans"

J'utilise Ubuntu 13.10 x64 et je travaille sur un projet que certains développeurs utilisent sous Windows. J'ai récemment modifié git config core.eol en "lf" et core.autocrlf en "entrée" et core.safecrlf en "vrai". Depuis lors, lorsque j'essaie de valider un fichier dans mon référentiel local, le message d'erreur suivant s'affiche:
fatal: CRLF would be replaced by LF in ......
D'après ce que j'ai compris, si je règle core.eol sur "lf" et core.autocrlf sur "entrée", git convertira automatiquement CRLF en LF, mais pourquoi cette erreur se produit-elle? Comment puis-je résoudre ce problème?

Je vous remercie.

69
aserww106

C'est un problème classique:

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

La solution habituelle consiste à 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
198
VonC

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

Je devais exécuter une deuxième commande pour que cela fonctionne:

$ git config --global core.autocrlf false
$ git config --global core.safecrlf false
45
almo
$ git config core.autocrlf false
27
Arun

On peut juste essayer dos2unix:

dos2unix [filename]
8
Yola

Cela m'est arrivé sur des milliers de fichiers. J'ai donc écrit un script bash rapide pour que dos2unix le répare 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 à partir de la sortie d'erreur. Ensuite, il exécute dos2unix sur ce fichier. Il répète ce processus jusqu'à ce que 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+c ou command+c pour l'arrêter.

4
GreenRaccoon23

Vous devez ajouter tous les fichiers que git status affiche tels que modifiés:

git add file1
git add file2

Et puis validez vos modifications:

git commit

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

0
Karl.S

J'ai rencontré le même problème et résolu avec l'édition .gitattributes ci-dessous.

$ vim .gitattributes

commentez 2 lignes en .gitattributes

-* text=auto
-* text eol=lf
+# * text=auto
+# * text eol=lf
0
Kazma Arakaki

Pour votre information, je ne suis pas sûr que cela s’applique à vous, mais j’obtenais cette erreur en essayant par inadvertance d’ajouter tous les node_modules aux modifications planifiées. Donc, en fait, .gitignoring le node_modules a résolu mon problème.

0
Nickofthyme