Git diff denkt, dass Zeilenenden LF sind, wenn EOL in .gitattributes auf CRLF gesetzt ist

8

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) :

%Vor%

Ich füge am Ende der ersten Zeile ein Leerzeichen hinzu, 20 0d 0a :

%Vor%

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?

    
Ryan Jenkin 08.11.2016, 03:46
quelle

4 Antworten

3

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:

  1. Ссылка

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:

  1. Ссылка
user 13.11.2016 15:53
quelle
2

Überprüfe zuerst deinen git config core.autocrlf -Wert.

Um sicherzustellen, dass Ihre .gitattributes-Direktiven die einzigen sind, die angewendet werden, geben Sie Folgendes ein:

%Vor%

Klonen Sie dann erneut Ihr Git Repo und sehen Sie, ob das Problem weiterhin besteht.

    
VonC 10.11.2016 07:00
quelle
2

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

    
Marcin Nabiałek 11.11.2016 13:56
quelle
2

Der Schlüssel hier ist, dass, ob Sie text=auto , text eol=crlf oder text eol=lf verwenden, git will:

  1. Konvertiere Zeilenenden in LF im Repository (d. h. auf git commit )
  2. Konvertieren Sie Zeilenenden in das von Ihnen bevorzugte Format, wenn Sie von der Repository zu Ihrem Arbeitsbaum (d. h. auf 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: Ссылка

    
TeamTam 11.11.2016 05:32
quelle

Tags und Links