Erhalten eines schwerwiegenden Fehlers in Git für mehrstufige Einträge

241

Verwenden von Git Version 2.2.0 mit Unity Game Engine unter OS X und wollte meinen Code festschreiben. Ich habe alles hinzugefügt und keine Fehlermeldung erhalten. Geben Sie dann -m fest und erhalten Sie die folgende Fehlermeldung:

fatal: multiple stage entries for merged file 'Assets/Prefabs/Resources'

Als ich es nicht bemerkte, drückte ich, dass es keine Fehlermeldung gab, sagte Everything up-to-date ich also Bitbucket (wo das Repo gehalten wird) und es zeigte nicht mein Commit. Also habe ich mein lokales Protokoll überprüft und das zeigt auch nicht mein Commit.

Ich habe in Google nach einer Antwort gesucht ... und nichts. Was ist das für ein Fehler? und wie kann ich das beheben?

Daniel Toebe
quelle
Welche Version von Git oder Tool verwenden Sie? In der Entwicklerliste wurde kürzlich ein Thread zur Verbesserung der Überprüfung auf mehrstufige Einträge veröffentlicht. news.gmane.org/gmane.comp.version-control.git
Philip Oakley
Klingt wahrscheinlich, dass die zusätzliche Überprüfung in 2.2.0 beteiligt sein könnte. "Stellen Sie sicher, dass nicht zusammengeführte Einträge entfernt werden" 12. August von Jaime Soriano Pastor, möglicherweise ein Thread, mit dem Sie beginnen können.
Philip Oakley
4
Warum passiert das?
Charlie Parker
Nehmen Sie einfach eine Dummy-Bearbeitung der genannten Datei vor und klicken Sie auf "Festschreiben und Synchronisieren".
Sajanyamaha
Hinweis: Siehe auch stackoverflow.com/a/51919644/6309
VonC

Antworten:

381

Die erste Problemumgehung, die mit neueren Versionen von Git scheint zu funktionieren (2.3+, Q2 + 2015) wird in der genannten Zuschuss ist mehr up-to-date Antwort :

  1. Löschen Sie den Index

    $ rm .git/index
    
  2. Füge alle Hinzu

    $ git add -A
    
  3. Verpflichten

    $ git commit -a
    

Ursprüngliche Antwort (Ende 2014)
Die übliche Problemumgehung lautet:

  • Klonen Sie das Remote-Repo erneut in ein neues lokales Repo
  • Fügen Sie die Änderungen vom ersten zum zweiten Repo hinzu:

    $ cd /patH/to/second/cloned/repo
    $ git --work-tree=/path/to/first/repo add .
    

Sie können diese Fehlermeldung in sehen read-cache.c, die in diesem Patch (" read-cache.c: Sicherstellen, dass nicht zusammengeführte Einträge entfernt werden ") und im Git 2.2-Commit eingeführt wurde .
Da dies so neu ist, ist es möglich, dass ein Downgrade durchgeführt wird Git auf 2.1 ausreicht, um von diesem Patch nicht betroffen zu sein.

Das OP Daniel Toebe fügt in den Kommentaren hinzu :

Das Problem trat auf meinem MacBook auf, das sich entschied, bei mir zu scheitern, und ein anderes Computer-Missgeschick brachte mich bei meinen Projekten weit hinterher.

VonC
quelle
@sharpner Es ist möglich, dass es sich um einen Fehler oder eine Nebenwirkung dieses Patches in Ihrem Fall handelt.
VonC
1
Entschuldigen Sie die verspätete Antwort ... Das Problem trat auf meinem MacBook auf, das sich entschied, bei mir zu scheitern, und ein anderes Computer-Missgeschick brachte mich bei meinen Projekten weit zurück.
Daniel Toebe
1
@ DanielToebe gutes Feedback. Ich habe es in die Antwort für mehr Sichtbarkeit aufgenommen.
VonC
Ich bin gerade auf dasselbe git commit -c sha
Chris Leishman
2
Für alle Interessierten ist mir dies passiert, weil ich versehentlich eine Datei in meinem .git-Ordner anstelle der Datei selbst bearbeitet habe.
ostler.c
166

Ich glaube, ich bin auf dieses Problem gestoßen, weil ich Änderungen hinzugefügt und festgeschrieben und dann eine Datei gelöscht habe, die ich gerade festgeschrieben hatte. Wenn dies Ihrem Fall ähnlich klingt, empfehle ich, die folgenden Schritte auszuführen, um das erneute Klonen und das manuelle Hinzufügen Ihrer Änderungen zu speichern.

Ich konnte dieses Problem beheben, indem ich die .git / index-Datei in meinem Repository löschte, ähnlich wie von @slider vorgeschlagen (ich glaube, er hat den Pfad falsch eingegeben).

rm .git/index

Dann musste ich meine lokalen Änderungen erneut hinzufügen und festschreiben

git add -A
git commit -m "..."

Ich konnte dann aus der Ferne pushen.

Was ist der Git-Index und wie ist er relevant?

Was ist mit dem Git-Index los?

Im Git-Index platzieren Sie Dateien, die in das Git-Repository übernommen werden sollen.

Bevor Sie Dateien in das Git-Repository "festschreiben" (einchecken), müssen Sie die Dateien zuerst in den Git-Index einfügen.

Ich glaube, dass durch das Löschen dieser Datei git das Repo neu indiziert, ein neues erstellt und Sie können loslegen. Es löst dieses Problem, da das lokale Repository ohne die von mir gelöschte Datei neu indiziert wird, was die ganze Aufregung verursacht hat.

Bearbeiten: Es scheint, dass dies mit dem Mac zusammenhängt (basierend auf Kommentaren). Wenn es hilft, bin ich unter OSX 10.10 und Git Version 2.3.4, die über Brew installiert wurden.

gewähren
quelle
1
Ja, das hat funktioniert und danke für die Erklärung. Eine Einschränkung besteht darin, bevor Sie dies tun, Dateien zu speichern, zu verschieben oder zu löschen, für die Sie die aktuelle Standardänderungsliste nicht hinzugefügt haben. Sie werden wieder mit demgit add -A
Kirby
4
Bestätigen Sie dies unter Mac OS X Yosemite. Passiert während der Arbeit in Android Studio, obwohl es kein spezifisches reproduzierbares Szenario gab.
Drew
4
Dies sollte die richtige Antwort sein, da es funktioniert und eine bessere Erklärung hat. Das ist mir auch passiert.
Jared Burrows
1
Hat auch für mich gearbeitet. Das Hinzufügen des Versionskontrollstamms in IntelliJ hat es kaputt gemacht, aber das Ändern des Git-Index hat gut funktioniert. Danke für die Erklärung @grant.
Andrew Eells
1
Ich hatte auch dieses Problem, als IntelliJ im Hintergrund lief, während ich einige Änderungen mit vim vornahm. Ich denke, es gab eine Rennbedingung in git. (Eigentlich glaube ich, dass es viele davon gibt.) Das Schließen von IntelliJ, das Entfernen des Index und das erneute Festschreiben meiner Arbeit haben einwandfrei funktioniert.
Robert Fischer
119

Für das Projekt

rm .git/index
git reset

Nach dem Löschen des Index müssen Sie ihn durch Git-Reset neu erstellen

Für Submodul:

Gehen Sie zum Hauptprojektordner

rm .git/modules/your_project_structure/index
git reset --hard HEAD
farincz
quelle
4
Der Git-Reset nach dem Entfernen des Index hat ihn total genagelt. Vielen Dank! Wenn Sie nicht zurücksetzen, ist jede Datei neu im Index und muss hinzugefügt werden. Durch das Zurücksetzen wird der Index anscheinend neu erstellt. Auch wenn ich nicht verstehe, wie Git den Index ohne Index neu erstellen kann?
JosFabre
1
@ JosFaber Da der Index kein Commit-Verlauf ist. Eigentlich ist es eine "redundante" Hilfsstruktur. Siehe schacon.github.io/gitbook/7_the_git_index.html. Es kann also vollständig neu erstellt werden, indem Arbeitsbaum und HEAD verglichen werden. Und genau das macht Git Reset. Manpage sagt: ...
Kopiereinträge
2
Danke dir! Ohne das Zurücksetzen des Git wollte ich alle Dateien, die sich bereits im Repository befinden, erneut hinzufügen.
Robert Bernstein
1
Ich benutze Sourcetree auf meinem Mac. Ich habe die .git / index manuell gelöscht, dann das letzte gute Commit ausgewählt, mit der rechten Maustaste geklickt und den Master (in meinem Fall) auf diesen Kommentar zurückgesetzt - und dann die gemischte Option ausgewählt, die meine Arbeit in einem guten Zustand belässt. Ich konnte dann ein Commit meiner aktuellen Arbeit machen und jetzt ist alles gesund.
user216661
1
Der sauberste und schnellste Weg!
h4rd4r7c0r3
29

Sie können die Git-Indexdatei aus Ihrem Projekt entfernen. Führen Sie im Stammverzeichnis Ihres Projekts den folgenden Befehl aus:

rm .git/index

Danach funktioniert es.

Schieberegler
quelle
3
Dies beantwortet die Frage nicht. Bitte konkretisieren Sie diese Antwort mit weiteren Details.
ArtOfCode
Hat bei mir nicht funktioniert rm: /.git/index: No such file or directoryMac OSX Yosemite; Git 2.3.4 installiert durch Homebrew
Grant
@grant Du musst den Schrägstrich am Anfang entfernen. ( rm .git/indexin deinem Git-Verzeichnis).
ChristophLSA
2
@ChristophLSA Danke - Ich antwortete mit einer Beschreibung, was diese Aktion tut, um Klarheit zu schaffen. Kann diese Antwort aktualisiert werden, um den richtigen Pfad wiederzugeben und die Benutzer über die Aktion zu informieren?
gewähren
1
Ich weiß warum das funktioniert. Das Problem wird durch einen beschädigten Index verursacht. Ich bin auf dieses Problem gestoßen, als ich den Index durch Ändern des Codes in IntelliJ beim Schreiben einer Festschreibungsnachricht in der Befehlszeile beschädigt habe. Durch das Löschen des Index werden Ihre Änderungen nicht zerstört, sondern lediglich freigegeben.
Pyrolistical
3

Ich versuche eine andere Lösung und es funktioniert für mich. Unten sind meine Optionen

#cd .git
#rm index
#cd ..
#git add .
wqycsu
quelle
Wie @farincz sagte, müssen Sie den Index erneut erstellen, indem Sie ihn aufrufen, git resetandernfalls erhalten Sie ihn fatal: Could not reset index file to revision 'HEAD' .
Kuskmen
1

Wenn dies in einem Submodul passiert

Die Indexdatei befindet sich im übergeordneten .gitVerzeichnis:

.git/modules/your_project_structure/index

In einem Submodul gibt es keine benannten Verzeichnisse .git(zumindest in dem Projekt, an dem ich arbeite), sondern nur eine .gitDatei, die Ihnen (und git) sagt, wo Sie nach dem git-Verzeichnis dieses Projekts suchen müssen.

Der Git-Status zeigt Änderungen an, die ich nicht vorgenommen habe

Nachdem git resetich die Indexdateien entfernt und a ausgeführt hatte , sah ich mich vielen unerklärlichen Änderungen gegenüber, und ein Hard-Reset half nicht.

Warnung: Sie verlieren alle Ihre Änderungen. Legen Sie sie fest und drücken Sie sie, bevor Sie fortfahren.

Der Index schien beschädigt zu sein, daher habe ich ihn mit den folgenden Befehlen entfernt.

git rm -rf --cached .
git reset --hard HEAD
Emile Bergeron
quelle
0

Ich habe gerade diesen Fehler mit dem Github Desktop Client (OSX) erhalten. Alles was ich getan habe war die App zu beenden und wieder zu öffnen und dann fing es an zu funktionieren.

Oren
quelle