So beheben Sie "Fehler: fehlerhafter Index - schwerwiegend: Indexdatei beschädigt" bei Verwendung von Git

611

Danach habe git initich einige Dateien hinzugefügt und festgeschrieben, einige Änderungen vorgenommen, hinzugefügt und festgeschrieben. Richten Sie den Git-Daemon ein (der unter Cygwin unter WinXP ausgeführt wird) und klonen Sie das Repository einmal. Jetzt erhalte ich diesen Fehler mit dem geklonten Repository:

$ git status
error: bad index file sha1 signature
fatal: index file corrupt

Gibt es eine andere Möglichkeit, dies zu beheben, als eine neue Kopie des Repositorys zu erhalten?

Nummer 8
quelle
Befindet sich dies im geklonten Repository oder im ursprünglichen Repository? Hat der Klonbefehl Fehler ausgegeben?
CB Bailey

Antworten:

1256

Wenn das Problem mit dem Index als Staging-Bereich für Commits (dh .git/index) besteht, können Sie den Index einfach entfernen (eine Sicherungskopie erstellen, wenn Sie möchten) und dann den Index auf die Version des letzten Commits zurücksetzen:

Unter OSX / Linux:

rm -f .git/index
git reset

Unter Windows:

del .git\index
git reset

(Der resetobige Befehl ist der gleiche wie git reset --mixed HEAD)

Sie können alternativ auch niedrigere Wasserleitungen git read-tree anstelle von verwenden git reset.


Wenn das Problem mit dem Index für die Packdatei besteht , können Sie ihn mithilfe von wiederherstellen git index-pack.

Jakub Narębski
quelle
27
Ich habe versehentlich ein :w!in a :Gstatus(von fugitive.vim) gemacht. Diese Antwort ersparte mir viel Haarziehen.
Laurence Gonsalves
5
Ich weiß, wir mögen keine "Ich auch" -Nachrichten - sondern "Ich auch". Äquivalent in Windows ist erase /s .git\index, ich brauchte auch eine erase .git\index.lock.
Jeremy McGee
1
Hallo, ich hatte das gleiche Problem mit Suchen und Ersetzen, aber Git-Reset sagt mir, dass es in .git / objectes / pack / zwei Pack-Dateien gibt, auf die nicht zugegriffen werden kann. Haben sie eine Idee ?
Epsilones
13
Wäre es nicht sicherer, git reset --keepstattdessen zu verwenden ? Im Tower Git Cheat Sheet wird Folgendes
Pjetr
10
Es gab es nicht, als ich diese Antwort schrieb ... Wie auch immer, es git reset --keepist eine sicherere Form von git reset --hard; git reset --mixedberührt workdir überhaupt nicht.
Jakub Narębski
76

Möglicherweise haben Sie versehentlich die .git / index-Datei mit einem sed in Ihrem Projektstamm beschädigt (Refactoring vielleicht?) Mit folgenden Elementen:

sed -ri -e "s/$SEACHPATTERN/$REPLACEMENTTEXT/g" $(grep -Elr "$SEARCHPATERN" "$PROJECTROOT")

Um dies in Zukunft zu vermeiden, ignorieren Sie einfach Binärdateien mit Ihrem grep / sed:

sed -ri -e "s/$SEACHPATTERN/$REPLACEMENTTEXT/g" $(grep -Elr --binary-files=without-match "$SEARCHPATERN" "$PROJECTROOT")
Kochfelder
quelle
6
Wenn es Ihnen nichts ausmacht, Änderungen zu verlieren .git/index, können Sie sie jederzeit löschen und mit git reset(ohne --hard!) Neu erstellen .
Jakub Narębski
1
Ich habe es mit # find ./ -type f -exec sed -i 's / Politician / Legislator / g' {} \ gebrochen; Das zu tun, was diese Antwort empfiehlt, hätte es nicht an erster Stelle gebrochen, aber die akzeptierte Antwort hat den Schaden behoben, den ich angerichtet habe. Dies ist jedoch eine hervorragende Prävention.
Ryan Mortensen
1
@RyanMortensen Sie könnten versuchen, Ihre sedmit so etwas wie invertieren. find .git/ -type f -exec sed -i 's/Legislator/Politician/g' {} \; Dies könnte helfen, wenn Ihre .git/so beschädigt ist, dass git resetnicht funktioniert. Oder Sie möchten Ihr vorhandenes wiederherstellen, .git/indexohne es zu löschen. Dies schlägt natürlich fehl, wenn in Ihrem ursprünglichen Code oder Index bereits einige "Gesetzgeber" enthalten waren.
Kochfelder
1
Danke @hobs, du hast mir viel Ärger erspart - ich habe es gelöst, indem ich das invertiert habe, sedindem ich new_stringmein durch mein ersetzt habe old_string!
Tsveti_iko
1
Ich habe mein gesamtes Projekt anstelle des Ordners 'src' in IntelliJ überarbeitet und hatte dieses Problem. Das erklärt, warum ich so seltsame Fehler hatte!
Michael
18

Ich hatte dieses Problem und versuche es damit zu beheben:

rm -f .git/index
git reset

Aber es hat nicht funktioniert. Die Lösung ? Aus irgendeinem Grund hatte ich andere .git-Ordner in Unterverzeichnissen. Ich lösche diese .git-Ordner (nicht den Principal) und git resetwieder. Sobald sie gelöscht wurden, funktionierte alles wieder.

Cleiton Almeida
quelle
15

Das klingt nach einem schlechten Klon. Sie können Folgendes versuchen, um (möglicherweise?) Weitere Informationen zu erhalten:

git fsck --full
Gav
quelle
8

Da die oben genannten Lösungen zu anhaltenden Problemen führten, habe ich diese langweilige Lösung verwendet:

  1. Klonen Sie eine neue Kopie des Repos an einer anderen Stelle
  2. Kopieren Sie das frische .git-Verzeichnis in das (kaputte) Repo, das die Änderungen enthielt, die ich festschreiben wollte

Hat den Trick gemacht. Übrigens habe ich eine sedProjektwurzel erstellt, wie @hobs vermutet hat. Ich habe meine Lektion gelernt.

eskimwier
quelle
Das ist genial :)
Jeremy Belolo
Es ist nicht wirklich brillant, wenn Sie sich mitten in einer Fusion befanden, Zweige erstellt oder Commits seit dem Klonen oder einer Reihe anderer Szenarien ausgegeben haben ... Das Klonen einer neuen Kopie des Repos ist kaum eine Lösung, und ich glaube es riecht nach Ungeduld (am besten in einer echten Prise). Es ist viel besser, tatsächlich zu diagnostizieren, was los ist, und den vorhandenen Repo-Index zu reparieren - das ist normalerweise relativ einfach. Manchmal können Sie die Indexdatei einfach umbenennen (oder löschen, wenn Sie sicher sind, dass Sie sie nie wieder benötigen) und Git eine neue erstellen lassen (mit git-reset oder git-checkout).
Jazimov
7

Das hat bei mir funktioniert. Obwohl ich neugierig bin, warum ich die Fehler überhaupt erst bekommen habe. Als ich mich gestern abmeldete, war es in Ordnung. Melde dich heute Morgen an, das war es nicht.

rm .git/index

git reset
Achtzig
quelle
Dies funktionierte für mich, obwohl alle hinzugefügten Dateien aus Git entfernt wurden. Ich musste git add für diese Dateien
ausführen
6

Hinweis für Benutzer von Git-Submodulen - die Lösungen hier funktionieren für Sie nicht wie sie sind.

Angenommen, Sie haben beispielsweise ein übergeordnetes Repository aufgerufen devund Ihr Submodul-Repository wird aufgerufen api.

Wenn Sie sich innerhalb von befinden apiund den in dieser Frage genannten Fehler erhalten:

error: bad index file sha1 signature fatal: index file corrupt

Die indexDatei befindet sich NICHT in einem .gitOrdner. Tatsächlich handelt .gites sich nicht einmal um einen Ordner, sondern um ein Textdokument mit dem Speicherort der tatsächlichen Git-Daten für dieses Repository. Wahrscheinlich so etwas:

~/dev/api $ cat .git gitdir: ../.git/modules/api

Stattdessen rm -f .git/indexmüssen Sie Folgendes tun:

rm -f ../.git/modules/api/index git reset

oder allgemeiner

rm -f ../.git/modules/INSERT_YOUR_REPO_NAME_HERE/index git reset

jenming
quelle
4

Dieses Problem kann auftreten, wenn sich .gitunter einem der Unterverzeichnisse ein Verzeichnis befindet . Überprüfen Sie zur Behebung, ob dort andere .git-Verzeichnisse vorhanden sind, entfernen Sie sie und versuchen Sie es erneut.

Nick Kuijpers
quelle
Mehrere andere Antworten haben diese Informationen bereits geliefert.
Simon Forsberg
-1

Ich habe einen einfachen Trick gemacht. Ich klone das Repo in einen neuen Ordner. Kopierte den .git-Ordner aus dem neuen Ordner in den alten Ordner des Repos und ersetzte dort .git.

Astra Uvarova - Saturnstern
quelle
Sehr gefährlich, da dadurch Daten wie unveröffentlichte Commits, Tags und Zweige sowie Stashes und das Reflog gelöscht werden.
Koraktor
Ich bin mir nicht sicher über unveröffentlichte Commits, da ich glaube, dass sie im .git-Ordner gespeichert sind und ich den .git-Ordner kopiert habe. Ich habe mit dieser Methode nichts verloren. Ich weiß nichts über Stashes und Reflog, um Kommentare dazu abzugeben.
Astra Uvarova - Saturnstern
Sie haben Recht, aber vielleicht sollten Sie betonen, dass Sie einen lokalen Klon erstellt haben. Aber mein Kommentar gilt immer noch für Stashes und Reflog.
Koraktor
Okay, ich habe keine Erfahrung mit diesem Kommentar, aber es hat bei mir funktioniert und einige Benutzer finden es möglicherweise nützlich. Es besteht keine Notwendigkeit, es abzustimmen.
Astra Uvarova - Saturns Stern
-7

Das ist lächerlich, aber ich habe gerade meinen Computer (Mac) neu gestartet und das Problem war verschwunden, als wäre es nie passiert. Ich hasse es, wie ein Support-Typ zu klingen ...

Herman Leus
quelle
-9

Sie können auch versuchen, die vorherige Version der Datei wiederherzustellen (wenn Sie Windows OS verwenden).

Shyamsundar
quelle
1
Geben Sie keine Antwort, die Sie nicht kennen.
Altaf Patel