Wenn ich Änderungen an einer Datei mit Windows-Zeilenenden zurückstelle und .gitattributes das EOL als CRLF definiert, denkt git, dass die Zeilenendungen in LR geändert wurden, obwohl ein Hex-Editor CRLF anzeigt.
Dies tritt nur auf, wenn .gitattributes das EOL-Zeichen definiert.
Ohne .gitattributes:
Das funktioniert korrekt.
Dies ist die ursprüngliche Version meiner Datei Web.config. Die letzten beiden Zeichen sind 0d 0a (CR LF)
:
Ich füge am Ende der ersten Zeile ein Leerzeichen hinzu, 20 0d 0a
:
Git diff zeigt das Leerzeichen an:
%Vor%Datei rückgängig machen und alle Änderungen sind weg:
%Vor%Mit .gitattributes
Das funktioniert nicht richtig.
Definieren Sie CRLF für .gitattributes:
%Vor%Fügen Sie am Ende der ersten Zeile das Leerzeichen hinzu:
%Vor%Git diff zeigt den Raum, aber die CR fehlt (^ M):
%Vor%Datei zurücksetzen:
%Vor%Git denkt, dass die CR aus ALLEN Zeilen entfernt wurde:
%Vor%Aber das ist im Hex-Editor nicht der Fall:
%Vor%Was passiert hier und wie bekomme ich es richtig?
Dies ist ein Bug auf git, mit dem ich mich manchmal konfrontiert sah. Sie können es dem Team git
melden:
Fragen oder Kommentare für die Git-Community können unter Verwendung der E-Mail-Adresse [email protected] an die Mailingliste gesendet werden. Fehlerberichte für Git sollten an diese Mailingliste gesendet werden.
Wenn Sie sich in Windows
befinden, können Sie auch versuchen, einen Fehlerbericht zu öffnen:
Vielleicht ist dieser Fehler auf der neuesten Version von git 2.10.2
behoben, du könntest ihn auf die neueste Version aktualisieren, falls nicht schon:
Um Unix-Zeilenendungen unter Windows zu haben, benutze ich:
%Vor%In deinem Fall solltest du wahrscheinlich folgendes einstellen:
%Vor%Sie können es offensichtlich für bestimmte Ordner und nicht global tun, wie ich oben gezeigt habe
Der Schlüssel hier ist, dass, ob Sie text=auto
, text eol=crlf
oder text eol=lf
verwenden, git will:
git commit
) git checkout
oder git merge
) Dies ist vielleicht kontraintuitiv, aber erinnere dich an die Ursprünge von Git aus der Linux-Welt und es ist kein Fehler. Aus der Git-Dokumentation : " Wenn eine Textdatei normalisiert wird, werden ihre Zeilenenden in LF umgewandelt das Repository ".
Als Konsequenz dazu finde ich, wenn ich einem bestehenden Projekt beitrete und .gitattributes
eingeführt werden muss, um Zeilenenden zu normalisieren, finde ich es am besten, ein Powershell-Skript (oder was immer Sie bevorzugen) zu schreiben, um Zeilenenden zu normalisieren in allen Dateien im Repository gleichzeitig. Dies ist, um laufende verwirrende Diffs zu vermeiden, wo die einzige Änderung die Zeilenendungen sind, die von .gitattributes
eingeführt wurden.
Schließlich, falls es hilft, habe ich bereits eine Sandbox veröffentlicht, um mit Einstellungen für die Zeilenendung auf meinem GitHub zu spielen: Ссылка
Tags und Links git