Ich habe ein Repo mit zwei Dateien, die ich angeblich lokal geändert habe.
Also bleibe ich dabei:
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: dir1/foo.aspx
# modified: dir2/foo.aspx
#
no changes added to commit (use "git add" and/or "git commit -a")
Wenn Sie dies tun git diff
, ändert sich der gesamte Dateiinhalt, auch wenn dies nicht wahr ist (es scheint gemeinsame Zeilenbereiche zu geben, die diff nicht zu sehen scheint).
Interessanterweise kann ich mich nicht erinnern, diese Dateien lokal geändert zu haben. Dieses Repo wird mit einem Remote-Repo verwendet (privat, bei GitHub.com, FWIW).
Egal was ich versucht habe, ich kann diese lokalen Änderungen nicht verwerfen. Ich habe alles versucht:
$ git checkout -- .
$ git checkout -f
$ git checkout -- dir1/checkout_receipt.aspx
$ git reset --hard HEAD
$ git stash save --keep-index && git stash drop
$ git checkout-index -a -f
Mit anderen Worten, ich habe alles versucht, was unter Wie verwerfe ich nicht bereitgestellte Änderungen in Git? und mehr. Die 2 Dateien bleiben jedoch als "geändert, aber nicht festgeschrieben" hängen.
Was zum Teufel würde dazu führen, dass zwei Dateien so hängen bleiben und scheinbar "Tabelle nicht wiederherstellen"?
PS In der obigen Liste mit Befehlen, die ich bereits ausprobiert hatte, habe ich fälschlicherweise geschrieben, git revert
als ich meinte git checkout
. Es tut mir leid und ich danke denen von Ihnen, die geantwortet haben, dass ich es versuchen sollte checkout
. Ich habe die Frage bearbeitet, um sie zu korrigieren. Ich habe es definitiv schon versucht checkout
.
git diff --ignore-space-change
odergit diff --ignore-all-space
macht es einen Unterschied in der Ausgabe vongit diff
?git diff
die Dateien identisch.git config --global core.autocrlf false
"wahr" zu setzen.Antworten:
Was sind die Zeilenenden in den Dateien? Ich wette, sie sind CRLF. Wenn dies der Fall ist, lesen Sie diese Anleitung: http://help.github.com/line-endings/
Kurz gesagt, Sie müssen sicherstellen, dass git so eingestellt ist, dass die Zeilenenden beim Festschreiben in LF konvertiert werden, und diese Dateien dann festschreiben. Dateien im Repo sollten immer LF sein, ausgecheckte Dateien sollten nativ des Betriebssystems sein, vorausgesetzt, Sie haben git richtig eingestellt.
quelle
git config --global core.autocrlf true
und die andere Partei drängt auf GitHub zum Repo.<pre>
Block dieses Handbuchs ausführen müssen, um die Dateien im Repo zu reparieren.Ich habe stundenlang versucht, ein ähnliches Problem zu lösen - einen von mir ausgecheckten Remote-Zweig, in dem vier Dateien hartnäckig als "Geändert, aber nicht aktualisiert" angezeigt wurden, selbst wenn alle Dateien gelöscht und
git checkout -f
erneut ausgeführt wurden (oder andere Variationen dieses Beitrags)!Diese vier Dateien waren notwendig, wurden aber von mir sicherlich nicht geändert. Meine endgültige Lösung - überzeugen Sie Git, dass sie nicht geändert wurden. Das Folgende funktioniert für alle ausgecheckten Dateien und zeigt den Status "Geändert" an. Stellen Sie sicher, dass Sie bereits festgeschriebene Dateien gespeichert haben.
Unter Mac OS X funktioniert xargs jedoch etwas anders (danke Daniel für den Kommentar):
Ich habe dies als Platzhalter für mich selbst für das nächste Mal hinzugefügt, aber ich hoffe, es hilft auch jemand anderem.
-Al
quelle
git ls-files -m | xargs -I {} git update-index --assume-unchanged {}
git ls-files -v|grep '^h' | cut -c3- | xargs -i git update-index --no-assume-unchanged "{}"
So habe ich das gleiche Problem in meinem Fall behoben: open .gitattributes change:
zu:
Speichern und schließen, dann zurücksetzen oder zurücksetzen, danke an @Simon East für den Hinweis
quelle
text=auto
Einstellung in .gitattributes hat bei mir funktioniert, und nachdem ichgit reset --hard
diese Einstellung zurückgesetzt habe, wurden die Dateien nicht mehr als geändert angezeigt !text=auto
Einstellung stimmt offensichtlich etwas nicht . Ich arbeite in Repos mit Commits von mehreren Betriebssystemen und habe immer noch nicht herausgefunden, was mir mehr Probleme bereitet: es zu behalten oder es fallen zu lassen.Eine andere Möglichkeit besteht darin, dass der Unterschied (der verhindert, dass Sie diese Dateien mit einem Checkout-Befehl zurücksetzen) im Dateimodus liegt. Das ist mir passiert. Auf meiner Version von git können Sie dies mithilfe von entdecken
Und es zeigt Ihnen Änderungen im Dateimodus. Sie können sie jedoch immer noch nicht zurücksetzen. Verwenden Sie dazu entweder
oder ändern Sie Ihre git .config in Ihrem Texteditor durch Hinzufügen
Nachdem Sie dies getan haben, können Sie verwenden
und die Datei sollte verschwinden.
(Ich habe all dies aus der Antwort auf Wie mache ich Änderungen am Git-Ignoriermodus (chmod)? )
quelle
core.filemode
wurde bereits auf false gesetzt). In meinem Fall war der Fix / Workaround der in Alan Forsyths Antwort .Versuchen Sie, lokale Änderungen rückgängig zu machen :
quelle
checkout
. Ich habe es schon versuchtcheckout
. Trotzdem vielen Dank für Ihre Antwort. Es war eine gute Antwort auf meine ursprüngliche Frage, also werde ich abstimmen.Ich hatte einige Phantom-geänderte Dateien, die als geändert angezeigt wurden, aber tatsächlich identisch waren.
Das Ausführen dieses Befehls funktioniert manchmal :
(Deaktiviert die "intelligenten", aber oft nicht hilfreichen Konvertierungen am Zeilenende von git)
In einem anderen Fall stellte ich jedoch fest, dass es sich um eine
.gitattributes
Datei im Stammverzeichnis handelte, in der einige Einstellungen für das Zeilenende vorhanden waren, die versuchte,autocrlf
bestimmte Dateien auch dann anzuwenden , wenn sie deaktiviert war. Das war eigentlich nicht hilfreich, also habe ich gelöscht.gitattributes
, festgeschrieben und die Datei wurde nicht mehr als geändert angezeigt.quelle
text=auto
Einstellung in .gitattributes hat bei mir funktioniert, und nachdem ichgit reset --hard
diese Einstellung zurückgesetzt habe, wurden die Dateien nicht mehr als geändert angezeigt !quelle
checkout
. Ich habe es schon versuchtcheckout
. Trotzdem vielen Dank für Ihre Antwort. Es war eine gute Antwort auf meine ursprüngliche Frage, also werde ich abstimmen.Möglicherweise hatten Sie auch ein Problem mit Verzeichnissen, in denen Buchstabenfälle benannt wurden. Einige Ihrer Kollegen haben möglicherweise den Namen des Verzeichnisses von z . B. myHandler in MyHandler geändert . Wenn Sie später einige der Dateien des ursprünglichen Verzeichnisses verschoben und abgerufen hätten, hätten Sie zwei separate Verzeichnisse im Remote-Repository UND nur eines auf Ihrem lokalen Computer, da Sie unter Windows nur eines haben können. Und du bist in Schwierigkeiten.
Um zu überprüfen, ob dies der Fall ist, überprüfen Sie einfach, ob das Remote-Repository eine doppelte Struktur aufweist.
Um dies zu beheben, erstellen Sie eine Sicherungskopie des übergeordneten Verzeichnisses außerhalb des Repos, löschen Sie das übergeordnete Verzeichnis und drücken Sie es. Ziehen Sie (hier sollte der zweite, der als gelöscht markiert ist, im Status angezeigt werden) und drücken Sie erneut. Erstellen Sie danach die gesamte Struktur aus Ihrem Backup neu und übertragen Sie die Änderungen erneut.
quelle
Ich denke, es wäre hilfreich, einen Hinweis zu geben, wie das Problem reproduziert werden kann, um das Problem besser zu verstehen:
2. Art der Reproduktion: Ersetzen Sie im obigen Skript diese Zeile:
echo "*.txt -text" > .gitattributes
durch
git config core.autocrlf=false
und behalten Sie den Rest der Zeilen bei
Was sagen alle oben genannten? Eine Textdatei kann (unter bestimmten Umständen) mit CRLF festgeschrieben werden (z. B.
-text
in.gitattributes
/ odercore.autocrlf=false
).Wenn wir später dieselbe Datei wie Text (
-text
->text
) behandeln möchten, muss sie erneut festgeschrieben werden.Natürlich können Sie es vorübergehend zurücksetzen (wie von Abu Assar richtig beantwortet ). In unserem Fall:
Die Antwort lautet : Wollen Sie das wirklich tun, weil es jedes Mal, wenn Sie die Datei ändern, dasselbe Problem verursacht?
Für die Aufzeichnung:
Um zu überprüfen, welche Dateien dieses Problem in Ihrem Repo verursachen können, führen Sie den folgenden Befehl aus (git sollte mit --with-libpcre kompiliert werden):
Wenn Sie die Datei (en) festschreiben (vorausgesetzt, Sie möchten sie als Text behandeln), ist dies dasselbe wie das, was in diesem Link http://help.github.com/line-endings/ vorgeschlagen wird, um solche Probleme zu beheben . Anstatt Sie zu entfernen
.git/index
undreset
auszuführen, können Sie einfach die Datei (en) ändern, dann ausführengit checkout -- xyz zyf
und dann festschreiben.quelle
Für mich ging es nicht um Zeilenenden. Es ging darum, die Groß- und Kleinschreibung im Ordnernamen zu ändern (Reset_password -> Reset_Password). Diese Lösung hat mir geholfen: https://stackoverflow.com/a/34919019/1328513
quelle
Ich hatte das gleiche Problem mit dem interessanten Zusatz, dass die Dateien unter Windows geändert wurden, aber nicht, wenn ich sie von der WSL aus betrachtete. Kein Durcheinander mit Zeilenenden, Zurücksetzen usw. konnte dies ändern.
Schließlich fand ich in dieser Antwort eine Lösung . Es folgt der Text zur Bequemlichkeit:
Ich habe dieses Problem mit den folgenden Schritten behoben
1) Entfernen Sie jede Datei aus dem Git-Index.
2) Schreiben Sie den Git-Index neu, um alle neuen Zeilenenden aufzunehmen.
Die Lösung war Teil der auf der Git-Website https://help.github.com/articles/dealing-with-line-endings/ beschriebenen Schritte.
quelle
Dieses Problem kann auch daran liegen, dass git Großschreibungsunterschiede als unterschiedliche Dateien behandelt, Windows sie jedoch als dieselbe Datei behandelt. Wenn nur die Groß- und Kleinschreibung eines Dateinamens geändert wurde, wird jeder Windows-Benutzer dieses Repos in dieser Situation enden.
Die Lösung besteht darin, zu bestätigen, dass der Inhalt der Dateien korrekt ist, und ihn dann erneut zu aktivieren. Wir mussten die beiden Dateiinhalte zusammenführen, da sie unterschiedlich waren. Ziehen Sie dann und es kommt zu einem Zusammenführungskonflikt, den Sie durch Löschen der doppelten Datei lösen können. Setzen Sie die Zusammenführungsauflösung erneut fest und Sie befinden sich wieder in einem stabilen Zustand.
quelle