Mögliche Ursache Nr. 1 - Normalisierung des Zeilenendes
Eine Situation, in der dies passieren kann, besteht darin, dass die betreffende Datei ohne die richtige Konfiguration für Zeilenenden (1) in das Repository eingecheckt wurde, was zu einer Datei im Repository mit den falschen Zeilenenden oder gemischten Zeilenenden führt. Stellen Sie zur Bestätigung git diff
sicher , dass nur Änderungen an den Zeilenenden angezeigt werden (diese sind möglicherweise standardmäßig nicht sichtbar. Versuchen Sie git diff | cat -v
, die Zeilenumbrüche als Literal anzuzeigen^M
anzuzeigen).
Anschließend hat wahrscheinlich jemand eine hinzugefügt .gitattributes
oder die core.autocrlf
Einstellung geändert , um die Zeilenenden zu normalisieren (2). Basierend auf der .gitattributes
oder globalen Konfiguration hat Git lokale Änderungen an Ihrer Arbeitskopie vorgenommen, die die angeforderte Normalisierung am Zeilenende anwenden. Leider aus irgendeinem Grundgit reset --hard
diese Änderungen der Leitungsnormalisierung nicht rückgängig gemacht.
Lösung
Problemumgehungen, bei denen die lokalen Leitungsenden zurückgesetzt werden, lösen das Problem nicht. Jedes Mal, wenn die Datei von git "gesehen" wird, wird versucht, die Normalisierung erneut anzuwenden, was zu demselben Problem führt.
Die beste Option ist, Git die gewünschte Normalisierung anwenden zu lassen, indem alle Zeilenenden im Repo normalisiert werden .gitattributes
und diese Änderungen vorgenommen werden - siehe Versuchen, Zeilenenden mit Git-Filter-Zweig zu korrigieren, aber kein Glück haben .
Wenn Sie wirklich versuchen möchten, die Änderungen an der Datei manuell zurückzusetzen, scheint die einfachste Lösung darin zu bestehen, die geänderten Dateien zu löschen und dann git anzuweisen, sie wiederherzustellen, obwohl ich feststelle, dass diese Lösung nicht zu 100% konsistent zu funktionieren scheint die Zeit ( WARNUNG: Führen Sie dies NICHT aus, wenn Ihre geänderten Dateien andere Änderungen als Zeilenenden aufweisen !!):
git status --porcelain | grep "^ M" | cut -c4- | xargs rm
git checkout -- .
Beachten Sie, dass dieses Problem weiterhin auftritt, sofern Sie die Zeilenenden im Repository nicht irgendwann normalisieren.
Mögliche Ursache Nr. 2 - Groß- und Kleinschreibung
Die zweite mögliche Ursache ist die Groß- und Kleinschreibung unter Windows oder Mac OS / X. Angenommen, im Repository ist ein Pfad wie der folgende vorhanden:
/foo/bar
Jetzt schreibt jemand unter Linux Dateien fest /foo/Bar
(wahrscheinlich aufgrund eines Build-Tools oder etwas, das dieses Verzeichnis erstellt hat) und pusht. Unter Linux sind dies jetzt zwei separate Verzeichnisse:
/foo/bar/fileA
/foo/Bar/fileA
Das Auschecken dieses Repos unter Windows oder Mac kann zu Änderungen führen fileA
, die nicht zurückgesetzt werden können, da bei jedem Zurücksetzen git unter Windows auscheckt /foo/bar/fileA
und Windows den Inhalt von fileA
with überschreibt, da bei Groß- und Kleinschreibung nicht berücksichtigt wird/foo/Bar/fileA
, was dazu führt, dass sie "geändert" werden.
Ein anderer Fall kann eine einzelne Datei sein, die im Repo vorhanden ist und die sich beim Auschecken in einem Dateisystem ohne Berücksichtigung der Groß- und Kleinschreibung überlappen würde. Beispielsweise:
/foo/bar/fileA
/foo/bar/filea
Es kann andere ähnliche Situationen geben, die solche Probleme verursachen können.
git on case-unempfindliche Dateisysteme sollten diese Situation wirklich erkennen und eine nützliche Warnmeldung anzeigen, dies ist jedoch derzeit nicht der Fall (dies kann sich in Zukunft ändern - siehe diese Diskussion und die zugehörigen vorgeschlagenen Patches auf der git.git-Mailingliste).
Lösung
Die Lösung besteht darin, den Fall von Dateien im Git-Index und den Fall im Windows-Dateisystem in Einklang zu bringen. Dies kann entweder unter Linux erfolgen, das den tatsächlichen Stand der Dinge anzeigt, oder unter Windows mit dem sehr nützlichen Open-Source-Dienstprogramm Git-Unite . Git-Unite wendet die erforderlichen Falländerungen auf den Git-Index an, der dann in das Repo übernommen werden kann.
(1) Das war wahrscheinlich von jemandem mit Windows, ohne .gitattributes
Definition für die betreffende Datei, und mit dem Standard globale Einstellung für core.autocrlf
das ist false
(siehe (2)).
(2) http://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line/
.
steht für aktuelles Verzeichnis nicht Stammverzeichnis