Dateien, die direkt nach einem Git-Klon als geändert angezeigt werden

226

Ich habe momentan ein Problem mit einem Repository und obwohl mein Git-Fu normalerweise gut ist, kann ich dieses Problem anscheinend nicht lösen.

Wenn ich dieses Repository klone, cdwerden im Repository git statusmehrere Dateien als geändert angezeigt. Hinweis: Ich habe das Repository in keinem Editor oder etwas anderem geöffnet.

Ich habe versucht, diesem Handbuch zu folgen: http://help.github.com/dealing-with-lineendings/ , aber dies hat bei meinem Problem überhaupt nicht geholfen.

Ich habe es git checkout -- .oft versucht , aber es scheint nichts zu tun.

Ich bin auf einem Mac und es gibt keine Submodule im Repository selbst.

Das Dateisystem ist auf dem Mac das Dateisystem "Journaled HFS +" und unterscheidet nicht zwischen Groß- und Kleinschreibung. Die Dateien sind einzeilig und haben jeweils eine Größe von ca. 79 KB (ja, Sie haben richtig gehört). Daher ist das Betrachten git diffnicht besonders hilfreich. Ich habe davon gehört, git config --global core.trustctime falsewas helfen könnte, was ich versuchen werde, wenn ich mit dem darauf befindlichen Repository zum Computer zurückkehre.

Ich habe Details des Dateisystems mit Fakten geändert! Und ich habe den git config --global core.trustctime falseTrick ausprobiert, der nicht sehr gut funktioniert hat.

Sam Elliott
quelle

Antworten:

141

Ich hatte das gleiche Problem auf dem Mac, nachdem ich ein Repository geklont hatte. Es würde davon ausgegangen, dass alle Dateien geändert wurden.

Nach dem Ausführen git config --global core.autocrlf inputwurden immer noch alle Dateien als geändert markiert. Nachdem ich nach einem Fix gesucht hatte, stieß ich auf eine .gitattributesDatei im Home-Verzeichnis, die Folgendes enthielt.

* text=auto

Ich habe es auskommentiert und alle anderen geklonten Repositories funktionierten von nun an einwandfrei.

Adnans
quelle
5
Vielen Dank! Ich fand dies schließlich, nachdem ich den ganzen Abend damit verbracht hatte, core.autocrlf und apply.whitespace umzuschalten. Das hat funktioniert. Danke.
xer0x
5
Die beleidigende Zeile in .gitattributes stammt aus den Dotfiles von Mathias Bynen , falls jemand anderes darauf stößt.
SeanPONeil
31
Kann jemand mehr Licht auf diese spezielle Konfiguration werfen? Was macht * text=autodas Was bedeutet es, es zu entfernen .gitattributes? Ich sehe, dass es dieses Problem für mich behebt, aber ich bin nicht sicher, warum es dies tut und was es wirklich tut und welche möglichen Probleme es möglicherweise verursacht?
Dennis
6
@Dennis Diese Einstellung hilft beim Normalisieren von Zeilenenden, daher ist das Löschen wahrscheinlich nicht die richtige Antwort. Siehe die Antwort dieser Frage und diesen Artikel . Die Antwort von @Arrowmaster unten war für mich hilfreicher. Ich habe verwendet git addund git commitdie Datei normalisiert und das Problem beseitigt.
jtpereyda
4
git config --global core.autocrlf inputhabe es für mich behoben. Vielen Dank.
Dimiguel
89

Ich habe es verstanden. Alle anderen Entwickler arbeiten unter Ubuntu (glaube ich) und haben daher Dateisysteme, bei denen zwischen Groß- und Kleinschreibung unterschieden wird. Ich jedoch nicht (da ich auf einem Mac bin). In der Tat hatten alle Dateien Zwillinge in Kleinbuchstaben, als ich sie mir mit ansah git ls-tree HEAD <path>.

Ich werde einen von ihnen bitten, das zu klären.

Sam Elliott
quelle
Haben sie es jemals geklärt? Ich habe möglicherweise das gleiche Problem.
Josh Johnson
8
Ja, lassen Sie einfach jemanden mit einem Dateisystem, bei dem zwischen Groß- und Kleinschreibung unterschieden wird, alle Dateien bis auf einen aus jedem Satz von Dateien löschen, die doppelte Dateinamen in einem Dateisystem ohne Berücksichtigung der Groß- und Kleinschreibung enthalten würden.
Sam Elliott
1
Ich bin gerade auf dasselbe Problem gestoßen, seit ich von Ubuntu auf Mac umgestiegen bin. Danke, deine Antwort hat den Nagel auf den Kopf getroffen. Hoffe, die positive Abstimmung bringt es auf die erste Position. :-)
chmac
1
@Dirk deshalb gibt es mehrere Antworten. Ich habe die in meinem Fall geltende akzeptiert, was nicht unangemessen ist.
Sam Elliott
1
Dies war auch mein Problem - MacOS ohne Berücksichtigung der Groß- und Kleinschreibung. Es wurde jedoch git ls-tree HEAD <path>nur eine einzige Datei angezeigt. Ich konnte jedoch die doppelten Dateien in der Benutzeroberfläche von GitHub.com anzeigen und diese Benutzeroberfläche auch zum Löschen einer Version verwenden.
Orion Elenzil
74
git config core.fileMode false

löste dieses Problem in meinem Fall

https://git-scm.com/docs/git-config

TL; DR;

core.fileMode

Bei false werden die ausführbaren Bitunterschiede zwischen dem Index und dem Arbeitsbaum ignoriert. nützlich auf kaputten Dateisystemen wie FAT. Siehe git-update-index (1).

Der Standardwert ist true, außer dass git-clone (1) oder git-init (1) core.fileMode prüfen und gegebenenfalls auf false setzen, wenn das Repository erstellt wird.

Piotr Korlaga
quelle
2
Aber was macht das?
Siwel
1
Ich würde auch gerne wissen, was das macht, weil es auch bei mir funktioniert hat.
Donato
2
Als ich das tat git diff, stellte ich fest, dass sich die Änderungen nur im Dateimodus befanden. Git nimmt auf, chmod -R 777 .was verursacht wurde, als ich mein Projekt ausführte
Ayushya
1
Der Link ist defekt ( "Entschuldigung, wir können Ihre Kernel nicht finden" ).
Peter Mortensen
Der Rest der Antworten funktionierte nicht, dies tat jedoch die Magie!
Treffen Sie Patel
53

Ich gehe davon aus, dass Sie Windows verwenden. Die GitHub-Seite, auf die Sie verlinkt haben, enthält die Details rückwärts. Das Problem ist, dass CR + LF-Zeilenenden bereits in das Repository übernommen wurden. Da Sie core.autocrlf entweder auf true oder auf input gesetzt haben , möchte Git die Zeilenenden in LF konvertierengit status zeigt, dass jede Datei geändert wird.

Wenn dies ein Repository ist, auf das Sie nur zugreifen möchten, an dem Sie jedoch nicht beteiligt sind, können Sie den folgenden Befehl ausführen, um das Problem lediglich auszublenden, ohne es tatsächlich zu lösen.

git config core.autocrlf false

Wenn dies ein Repository ist, an dem Sie aktiv beteiligt sind und an dem Sie Änderungen vornehmen können. Möglicherweise möchten Sie das Problem beheben, indem Sie ein Commit durchführen, bei dem alle Zeilenenden im Repository so geändert werden, dass LF anstelle von CR + LF verwendet wird, und dann Maßnahmen ergreifen, um zu verhindern, dass es in Zukunft erneut auftritt.

Das Folgende stammt direkt aus der Manpage gitattributes und sollte aus einem sauberen Arbeitsverzeichnis erstellt werden.

echo "* text=auto" >>.gitattributes
rm .git/index     # Remove the index to force Git to
git reset         # re-scan the working directory.
git status        # Show files that will be normalized.
git add -u
git add .gitattributes
git commit -m "Introduce end-of-line normalization"

Wenn Dateien git statusangezeigt werden, die nicht normalisiert werden sollen , deaktivieren Sie deren Textattribut, bevor Sie ausgeführt werden git add -u.

manual.pdf      -text

Umgekehrt kann bei Textdateien, die Git nicht erkennt, die Normalisierung manuell aktiviert werden.

weirdchars.txt  text
Pfeilmeister
quelle
8
Ich benutze keine Fenster.
Sam Elliott
1
Auf Nicht-Windows-Systemen ist core.autocrlf standardmäßig auf false festgelegt. Sie sollten dieses Problem also nicht einmal auftreten, wenn es durch Zeilenenden verursacht wird. Könnten Sie weitere Details zu Ihrem spezifischen Setup angeben, z. B. was git difffür die Dateien git statusangezeigt wird, in denen angegeben ist, dass sie geändert wurden, und welches Dateisystem Sie verwenden?
Arrowmaster
hat die Frage mit Antworten auf diese Fragen aktualisiert. Werfen Sie in ein oder zwei Sekunden einen weiteren Blick auf alle Details. Ich bin nicht sicher, was andere Mitglieder des Entwicklerteams verwenden
Sam Elliott
Das hat bei uns funktioniert ( git config core.autocrlf falsewar ausreichend). Wir wurden von der Tatsache getäuscht, dass der Client unter Linux (SL / RHEL) ausgeführt wird, die Linux-Sitzung jedoch über x2go von einem Windows-Host aus initiiert wird. Dies ist möglicherweise die wahrscheinlichste Lösung in einem homogenen Win + Lin-Kontext.
Dirk
37

Bitte führen Sie die folgenden Befehle aus. Das könnte das Problem lösen.

# Remove everything from the index.
git rm --cached -r .

# Write both the index and working directory from git's database.
git reset --hard
kds
quelle
Keine der anderen Lösungen hat für mich funktioniert, aber diese hat mich wieder zum Laufen gebracht.
rainabba
1
Ich habe es versucht und es hat bei mir funktioniert. Vielen Dank, Herr LIama!
Danniel Little
Dies macht mein Repository schlechter. Auf einem Zweig, der keine Änderungen hatte, hatte ich 277, nachdem ich ihn ausgeführt hatte. Ich hatte die gleichen Änderungen auch in anderen Filialen, zu denen ich gewechselt bin. Laufen Sie mit Vorsicht. Ich habe gerade per Repo neu geklont und 615 Dateien geändert. :(
Programmierer Paul
Dies funktionierte bei mir mit Git v2.7.4 mit Ubuntu (WSL), Git für Windows v2.18.0.windows.1 und posh-git. Ich hatte immer autocrlf false und das Problem begann in Git für Windows und posh-git nach dem Upgrade auf 2.18.0 heute
Jim Frenette
Ich bin erstaunt, dass das funktioniert. Danke für die Hilfe. Für andere, die diesen Weg
David Casper
16

Wenn Sie in Visual Studio Git verwenden, können Sie die Dateien .gitignore und .gitattributes automatisch generieren. Die automatisch generierte .getattributes-Datei enthält die folgende Zeile:

* text=auto

Diese Zeile befindet sich oben in der Datei. Wir mussten nur die Zeile kommentieren, indem wir ein # an der Vorderseite hinzufügen. Danach liefen die Dinge wie erwartet.

J Adam Rogers
quelle
1
Vielen Dank, habe damit um aaaages gekämpft
Andrew Berry
Das war genau mein Problem. Ein anderer Entwickler hatte GIT über VS anstelle von CLI verwendet und diese .gitattributes-Datei erstellt.
Josh Maag
12

Das Problem kann auch durch unterschiedliche Dateiberechtigungen entstehen , wie in meinem Fall:

Frisch geklontes Repository (Windows, Cygwin):

$ git ls-tree HEAD
100755 blob 8099ea496a2c78d71125d79a05855f60ebf07904    testfile
   ↑↑↑

Bare Remote-Repository (Linux):

$ git ls-tree HEAD
100644 blob 8099ea496a2c78d71125d79a05855f60ebf07904    testfile
   ↑↑↑
Gima
quelle
5

Ich wollte eine Antwort hinzufügen, die mehr auf "Warum" gerichtet ist, da dies bereits eine gute Antwort darauf gibt, wie dies behoben werden kann.

Hat .gitattributesalso eine * text=autoEinstellung, die dieses Problem verursacht.

In meinem Fall hatten Dateien im Hauptzweig von GitHub \r\nEndungen. Ich habe die Einstellungen im Repository gewählt, um mit \nEndungen einzuchecken . Ich weiß allerdings nicht, was Git auscheckt. Es soll mit nativen Endungen auf meiner Linux-Box ( \n) ausgecheckt werden, aber ich denke, es hat die Datei mit \r\nEndungen ausgecheckt. Git beschwert sich, weil es die ausgecheckten \r\nEndungen sieht , die sich im Repository befanden, und warnt mich, dass es \nEinstellungen eincheckt . Daher müssen Dateien "geändert werden".

Das ist mein Verständnis für jetzt.

Dennis
quelle
3

Ich hatte das gleiche Problem. Auch mit einem Mac. Beim Betrachten des Repositorys auf einem Linux-Computer stellte ich fest, dass ich zwei Dateien hatte:

geoip.dat und GeoIP.dat

Ich habe das veraltete auf dem Linux-Computer entfernt und das Repository erneut auf den Mac geklont. Ich konnte meine Kopie des Repositorys nicht abrufen, festschreiben, verstauen oder abrufen, wenn Duplikate vorhanden waren.

user2148301
quelle
3

Das gleiche Problem für mich. Ich konnte mehrere Bilder mit demselben Namen wie "textField.png" und "textfield.png" im Remote-Git-Repository sehen, aber nicht in meinem lokalen Repository. Ich konnte nur "textField.png" sehen, das im Projektcode nicht verwendet wurde.

Es stellt sich heraus, dass die meisten meiner Kollegen unter Ubuntu das ext4- Dateisystem verwenden, während ich mit APFS auf einem Mac bin.

Dank der Antwort von Sam Elliott war die Lösung recht einfach. Zuerst habe ich einen Kollegen unter Ubuntu gebeten, die redundanten Dateiversionen mit Großbuchstaben zu löschen, dann festzuschreiben und auf Remote zu drücken.

Dann lief ich folgendes:

# Remove everything from the index.
git rm --cached -r .

# Write both the index and working directory from git's database.
git reset --hard

Schließlich haben wir beschlossen, dass jeder Entwickler seine Git-Konfiguration ändern sollte, um zu verhindern, dass dies jemals wieder passiert:

# Local Git configuration
git config core.ignorecase = true

oder

# Global Git configuration
git config --global core.ignorecase = true
Adrian
quelle
Es wäre besser, wenn Sie nur upvoteddie Antwort von @ kds !
Elharony
Es scheint, dass der Befehlszeilenbefehl nicht das Gleichheitszeichen ( =) haben sollte, da er ignorecase = =in der Konfigurationsdatei landet.
Dmytro
1

Ich hatte auch gerade das gleiche Problem. In meinem Fall habe ich das Repository geklont und einige Dateien fehlten sofort.

Dies wurde dadurch verursacht, dass der Pfad zur Datei und der Dateiname für Windows zu lang waren. Um dies zu beheben, klonen Sie das Repository so nahe wie möglich am Festplattenstamm, um die Länge des Pfads zur Datei zu verringern. Klonen Sie es beispielsweise auf C:\A\GitRepostatt C:\Users Documents\yyy\Desktop\GitRepo.

8bitme
quelle
1

Bearbeiten Sie die Datei mit dem Namen .git/config:

sudo gedit .git/config

Oder:

sudo vim .git/config

Inhalt

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true

[remote "origin"]
    url = [email protected]:DigitalPlumbing/unicorn-magento.git
    fetch = +refs/heads/*:refs/remotes/origin/*

[branch "master"]
    remote = origin
    merge = refs/heads/master

[branch "productapproval"]
    remote = origin
    merge = refs/heads/productapproval

Wechseln Sie filemode=truein filemode = false.

Pramod Kharade
quelle
Dies ist gleichbedeutend mitgit config core.Filemode false
Guillermo Prandi
1

Bei neuen Versionen von macOS kann dies durch eine Sicherheitsfunktion des Betriebssystems verursacht werden.

In dem Repository, an dem ich gearbeitet habe, gab es eine Binärdatei mit dem Dateityp * .app.

Es waren nur einige serialisierte Daten, aber macOS behandelt alle * .app-Dateien als Anwendung. Da diese Datei nicht vom Benutzer heruntergeladen wurde, hielt das System sie für unsicher und fügte das com.apple.quarantineDateiattribut hinzu , das sicherstellt, dass die Datei nicht ausgeführt werden kann.

Durch das Festlegen dieses Attributs für die Datei wurde jedoch auch die Datei geändert, und es wurde daher im Git-Änderungssatz angezeigt, ohne dass eine Möglichkeit zum Zurücksetzen besteht.

Sie können überprüfen, ob Sie das gleiche Problem haben, indem Sie ausführen $ xattr file.app.

Die Lösung ist ziemlich einfach, solange Sie nicht mit der Datei arbeiten müssen. Fügen *.app binarySie einfach zu Ihrem .gitattributes.

Lukas Zech
quelle
0

Ich habe mein lokales Repository in einen anderen Ordner kopiert und eine Reihe geänderter Dateien angezeigt. Meine Problemumgehung war: Ich habe die geänderten Dateien gespeichert und den Speicher gelöscht . Das Repository wurde sauber.

Oleg Shvetsov
quelle
0

Ich habe festgestellt, dass Git meine Dateien (in diesem Fall .psd) als Text behandelt. Das Setzen auf einen Binärtyp in den .gitattributes löste das Problem.

*.psd binary
Lanny
quelle
0

Ich habe versucht, eine interaktive Rebase durchzuführen, aber es wurde behauptet, dass einige Dateien geändert wurden, sodass ich dies jetzt nicht tun konnte. Ich habe alles versucht , um zu einem sauberen Repository zurückzukehren, aber nichts hat funktioniert. Keine der anderen Antworten half. Aber das hat endlich geklappt ...

git rm -rf the-folder-with-modified-stuff
git ci -m 'WAT'

Boom! Repository reinigen. Problem gelöst. Dann musste ich nur das letzte Commit fallen lassen, als ich mein tat rebase -iund schließlich war alles wieder sauber. Bizarr!

Thomas Aylott
quelle
0

Nur für den Fall, dass es jemand anderem hilft, kann es eine andere Ursache für dieses Problem geben: unterschiedliche Versionen von Git. Ich habe die standardmäßig installierte Version von Git auf einer Ubuntu 18.04 (Bionic Beaver) -Box verwendet und alles hat einwandfrei funktioniert, aber beim Versuch, das Repository mit Git unter Ubuntu 16.04 zu klonen, wurden einige Dateien als geändert angezeigt.

Keine der anderen Antworten hier hat mein Problem behoben, aber das Upgrade der Git-Versionen auf beide Systeme hat das Problem behoben.

Todd Chaffee
quelle
1
Es wäre hilfreich (und interessant) zu wissen, welche Versionen von Git nicht gut zusammenspielen.
Jpaugh