2010-06-28 7 views
6

Wenn ich eine Datei über eine andere Datei in einem git-gesteuerten Verzeichnis kopiere ... sehe ich, dass git denkt, dass sich die ganze Datei geändert hat statt eines kleinen Brocks ... warum? HierWarum erkennt git ganze Dateien als geändert, wenn Dateien über andere Dateien kopiert werden?

ist ein Beispiel dafür, was ich meine ... http://github.com/cmodien/fileupdatetest/commit/90309ed099e257cd98218b4504cd2cd3a3a47a27

OK ... ich die Zeilenende auf der Datei überprüft ... Die ursprüngliche Datei crlf Zeilenende hat. Die Datei, die ich über das Original eingefügt habe, hat Zeilenenden. Was macht Sinn, denke ich ... Ich habe die Original-Datei von einem Windows-Benutzer und ich erhielt die neue Datei von einem Mac-Benutzer.

Wie behebe ich das?

+1

Was genau sehen Sie, dass macht Sie sagen, git denkt die ganze Datei hat sich geändert? –

+0

Weil ... Sie tatsächlich die ganze Datei geändert haben? Oder ist die neue Datei genau so wie die alte, außer in einem kleinen Bereich? –

+0

Wenn ich einen Git-Vergleich mache, nachdem ich die Datei kopiert und eingefügt habe, die ich von einem Kollegen erhalten habe, meldet das diff, dass sich die gesamte Datei geändert hat. Die Dateien unterscheiden sich nur durch die Größe von 97 Bytes. Der Inhalt ist identisch. – Clintm

Antwort

3

habe ich das Problem zu beheben ...

Trying to fix line-endings with git filter-branch, but having no luck

ich dies zu folgen ursprünglich versucht ... http://help.github.com/dealing-with-lineendings/ aber es war etwas unklar, dass auf dem Mac/nichts Sie Kern setzen müssen .autocrlf zur Eingabe und nicht wahr.

Die andere kleine Komplikation war, dass ich in meinem git ignoriert einige Dateien hatte ignorieren, dass ich brauchte auch zu reparieren ... so diesen Befehl ein:

git diff --cached --name-only -z | xargs -0 git add 

versagte ... also musste ich laufen diese ...

git diff --cached --name-only -z | xargs -0 git add -f 

zwingen sie die ignorierten Dateien als auch zu reparieren ...

4

Wie auf Twitter erwähnt, (@adymitruk) haben Sie ein Problem mit Zeilenenden. Die AutoCRLF-Einstellung ist wahrscheinlich nicht auf "false" gesetzt, wie es sein sollte - es sei denn, Sie arbeiten plattformübergreifend.

Die Lösung ist, es auf false setzen, beheben Sie die Zeilenenden setzen Sie die autocrlf auf false dann commit. Wenn dies erledigt ist, können Sie diese Dateien kopieren und dann nur die tatsächlichen Änderungen sehen.

+0

Danke Adam ... Ich hatte dieses Flag tatsächlich nicht gesetzt ... und ich habe versucht, dieses Flag hinzuzufügen, da ich annahm, dass das der Grund ist, warum git die ganze Datei als modifiziert sieht ... aber dieses Flag auf true setzt und Das Ausführen einer Reihe von Tests schien das Problem nicht zu beheben. Ich habe seitdem dieses Flag von .gitconfig entfernt. Das Problem besteht immer noch. Ich werde ein Beispiel codieren und es auf GitHub werfen. – Clintm

+0

Das nervte mich auch, als ich anfing Git zu benutzen. Sobald Sie autocllf auf false gesetzt haben, haben Sie dieses Problem nicht. Sie müssen immer noch eine Bereinigung durchführen, um die Zeilenenden auf das zu setzen, was sie nativ sind. –

3

Es gibt zwei Szenarien, in denen dies geschehen kann:

  1. Leer beschädigt ist. Ihr Editor konvertiert möglicherweise Leerzeichen in TABs oder umgekehrt: Legen Sie einfach Linux CodingStyle fest, um das Problem zu lösen.
  2. Leitungsenden sind beschädigt. Set core.autocrlf zu false und siehe this Diskussion über eine neue core.eol Variable.
Verwandte Themen