git commit get fatal fatal Fehler "fatal: CRLF würde durch LF in ersetzt werden"

84

Ich verwende Ubuntu 13.10 x64 und arbeite an einem Projekt, das einige Entwickler unter Windows verwenden. Ich habe kürzlich die Git-Konfiguration core.eolin "lf" und core.autocrlf"input" und core.safecrlfin "true" geändert . Wenn ich seitdem versuche, eine Datei in mein lokales Repository zu übertragen, wird folgende Fehlermeldung angezeigt : Soweit ich weiß, konvertiert git CRLF automatisch in LF,
fatal: CRLF would be replaced by LF in ......
wenn ich core.eol"lf" und core.autocrlf"input" setze , aber warum tritt dieser Fehler auf? aus? Wie kann ich dieses Problem beheben?

Danke dir.

aserww106
quelle

Antworten:

219

Dies ist ein klassisches Problem:

http://toub.es/sites/toub.es/files/styles/standard_article/public/field/image/firstcommit.png
(Bild aus Luis Tubes ' Blogbeitrag )

Die übliche Lösung besteht darin, diese Dateien selbst mit dos2unix oder Swiss File Knife zu konvertieren .

Ich habe immer bevorzugt zu halten core.autocrlfzufalse , was bedeutet:

git config --global core.autocrlf false
VonC
quelle
Diese Fehlermeldung kriecht sogar in der git diffAusgabe: git.661346.n2.nabble.com/…
VonC
8
Warum kann git CRLF für mich nicht in LF ändern, wenn ich bereits die core.autocrlfEingabe eingestellt habe?
aserww106
1
@ William, weil Sie unter Linux arbeiten und Dateien aus Windows verwenden.
VonC
Vielen Dank, @VonC, ich verwende dos2unix bereits, um alle Dateien zu ändern. Wenn also die Windows-Entwickler Code für ihr Repo festlegen, konvertiert git CRLF in LF, wenn ich es aus ihrem Repository ziehe, oder? Unser Git-Server ist auf Ubuntu.
aserww106
1
@William Ich meine, dass Sie gesagt haben "Ich habe kürzlich das git config core.eolin" lf"und core.autocrlf" input" geändert ": Das ändert nichts an den bereits vorhandenen Dateien. Das hätte Auswirkungen auf die Zukunft git pull. Die aktuellen Dateien befinden sich noch in CRLF. Wenn sie geändert werden, werden sie nach Möglichkeit in LF konvertiert. Andernfalls wird die von Ihnen erwähnte Fehlermeldung ausgelöst.
VonC
54

Ich hatte das gleiche Problem und versuchte die vorgeschlagene Lösung ohne Erfolg.

Ich musste einen zweiten Befehl ausführen, damit es funktioniert:

$ git config --global core.autocrlf false
$ git config --global core.safecrlf false
Almo
quelle
5
Gibt es negative Auswirkungen auf diese zusätzliche Bearbeitung?
AlleyOOP
Danke mein Herr! Helfen Sie mir im Jahr 2020 :)
Joe Spinelli
28
$ git config core.autocrlf false
Arun
quelle
3
Ich weiß nicht, was das macht, aber es funktioniert. Die tödliche Warnung verschwindet und ich habe keine Angst mehr.
Wh1tney
Ich habe dies getan und git diffsehe jetzt meine gesamte Datei (1000 Zeilen) als Konflikt. Die Diff-Tools sehen nur 3 Zeilenänderungen.
Dagrooms
10

Man kann einfach dos2unix ausprobieren:

dos2unix [filename]
Yola
quelle
4

Das ist mir bei Tausenden von Dateien passiert. Also habe ich ein schnelles Bash-Skript geschrieben, dos2unixum es für mich zu reparieren. Jemand anderes unter Linux oder Mac könnte es nützlich finden.

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

Grundsätzlich versucht es zu tun git add .. Wenn der Befehl fehlschlägt, wird der Name der inkompatiblen Datei aus der Fehlerausgabe abgerufen. Dann läuft es dos2unixauf dieser Datei. Dieser Vorgang wird so lange wiederholt, bis er git add .funktioniert.

Wenn Sie dies ausführen, sollten Sie dos2unix: converting file xxx to Unix format...wiederholt sehen. Wenn Sie dies nicht tun, funktioniert es nicht. Drücken Sie einfach ctrl+ coder command+ c, um es zu stoppen.

GreenRaccoon23
quelle
2
Falls jemand neugierig ist, wie ich es geschafft habe, Tausende von nicht festgeschriebenen Dateien zu sammeln, liegt das daran, dass das Repo eine Reihe von Code-generierten Bildern enthält. Ich habe ein Commit nicht um 3 Jahre verschoben oder so.
GreenRaccoon23
1

Sie müssen alle Dateien hinzufügen, git statusdie als geändert angezeigt werden:

git add file1
git add file2

Und dann übernehmen Sie Ihre Änderungen:

git commit

Dadurch bleiben Ihre lokalen Dateien unverändert, befinden sich jedoch autocrlfim Remote-Repository.

Karl.S
quelle
1

Ich hatte die gleichen Probleme und habe die Bearbeitung .gitattributeswie unten behoben .

$ vim .gitattributes

2 Zeilen in .gitattributes auskommentieren

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

Zu Ihrer Information, ich bin mir nicht sicher, ob dies auf Sie zutrifft, aber ich habe diesen Fehler erhalten, als ich versehentlich versucht habe, alle node_moduleszu den bereitgestellten Änderungen hinzuzufügen . Also eigentlich hat .gitignoringdas node_modulesmein Problem gelöst.

Nickofthyme
quelle
0

Ich bin auf einem Mac mit Terminal und hatte dieses Problem mit einer .htaccess-Datei, die ich festschreiben wollte. Dabei wurde der schwerwiegende Fehler angezeigt:

fatal: CRLF would be replaced by LF in .htaccess

Ich wollte das Problem wie die OP-Anforderungen beheben und nicht nur ein Git-Flag deaktivieren. Deshalb habe ich diesen Artikel gefunden , der einen Perl-Befehl enthält, um das Problem auf Dateibasis zu beheben.

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

Für meinen obigen .htaccess-Fehler habe ich Folgendes ausgeführt:

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

Die Flags -p, -i und -e (pie) können kombiniert werden, damit Sie Dateien mit Perl über die Befehlszeile bearbeiten können. In diesem Fall ersetzen Sie alle gefundenen \ r \ n durch \ n.

thetwopct
quelle