811 Stimmen

Behebung der Fehlermeldung "Error: bad index - Fatal: index file corrupt" bei Verwendung von Git

Nach git init Ich fügte ein paar Dateien hinzu und übertrug sie, nahm einige Änderungen vor, fügte sie hinzu und übertrug sie. Ich richtete den Git-Daemon ein (der unter Cygwin auf WinXP läuft) und klonte 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, dieses Problem zu beheben, als eine neue Kopie des Repositorys zu erstellen?

0 Stimmen

Ist dies im geklonten Repository oder im ursprünglichen Repository? Hat der Befehl clone irgendwelche Fehler ausgegeben?

1694voto

Jakub Narębski Punkte 286531

Wenn das Problem mit dem Index als der Aufenthaltsort für Übertragungen (d.h. .git/index ), können Sie den Index einfach entfernen (legen Sie eine Sicherungskopie an, wenn Sie möchten) und dann den Index in der Version der letzten Übertragung wiederherstellen:

Unter OSX/Linux/Windows (mit Git bash):

rm -f .git/index
git reset

Unter Windows (mit CMD und nicht mit git bash):

del .git\index
git reset

(Die reset ist dasselbe wie der obige Befehl git reset --mixed HEAD )

Sie können alternativ auch eine niedrigere Ebene verwenden Klempnerarbeiten git read-tree 代わりに git reset .


Liegt das Problem bei Index für Packdatei können Sie sie wiederherstellen, indem Sie git index-pack .

31 Stimmen

Ich habe versehentlich eine :w! in einem :Gstatus (aus fugitive.vim). Diese Antwort hat mir eine Menge Haarspalterei erspart.

6 Stimmen

Ich weiß, wir mögen keine "Ich auch"-Meldungen - aber "Ich auch". Das Äquivalent in Windows ist erase /s .git\index Ich brauchte eine erase .git\index.lock auch.

0 Stimmen

Ich musste rm .git/index verwenden, da ich eine zweideutige Warnung mit -f erhielt

79voto

hobs Punkte 16670

Möglicherweise haben Sie versehentlich die .git/index-Datei mit einem sed auf Ihrem Projekt Root (Refactoring vielleicht?) mit etwas wie beschädigt:

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

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

sed -ri -e "s/$SEACHPATTERN/$REPLACEMENTTEXT/g" $(grep -Elr --binary-files=without-match "$SEARCHPATERN" "$PROJECTROOT")

7 Stimmen

Wenn es Ihnen nichts ausmacht, Änderungen in .git/index können Sie sie jederzeit löschen und neu erstellen mit git reset (ohne --hard !).

2 Stimmen

Ich habe es mit # find ./ -type f -exec sed -i 's/Politician/Legislator/g' {} \Wenn ich das getan hätte, was diese Antwort empfiehlt, wäre es gar nicht erst kaputt gegangen, aber die akzeptierte Antwort hat den Schaden repariert, den ich angerichtet habe. Dies ist jedoch eine ausgezeichnete Vorbeugung.

1 Stimmen

@RyanMortensen Sie könnten versuchen, Ihre sed mit etwas wie find .git/ -type f -exec sed -i 's/Legislator/Politician/g' {} \; Dies könnte hilfreich sein, wenn Ihr .git/ so korrumpiert ist, dass git reset funktioniert nicht. Oder vielleicht möchten Sie Ihre bestehenden .git/index ohne sie zu löschen. Dies schlägt natürlich fehl, wenn Ihr ursprünglicher Code oder Index bereits einige "Legislator "s enthielt.

31voto

Cleiton Almeida Punkte 312

Ich hatte dieses Problem, und ich versuche, es damit zu lösen:

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 Hauptordner) und git reset wieder. Sobald sie gelöscht waren, funktionierte alles wieder.

0 Stimmen

Diese Antwort löst wirklich das Problem, wenn Sie einige .git-Ordner in vendor/ (e.x.) haben.

0 Stimmen

Rm' wird nicht als internes oder externes Kommando, lauffähiges Programm oder Batch-Datei erkannt!!!!!!!!!!!!!!!

21voto

Gav Punkte 10318

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

git fsck --full

18voto

eskimwier Punkte 967

Da ich mit den oben genannten Lösungen weiterhin Probleme hatte, habe ich diese langweilige Lösung verwendet:

  1. eine neue Kopie des Repo an anderer Stelle klonen
  2. Kopieren des neuen .git-Verzeichnisses in das (kaputte) Repo, das die Änderungen enthält, die ich übertragen wollte

Das hat geklappt. Übrigens, ich habe eine sed über das Projekt Root, wie @hobs vermutet hat. Ich habe meine Lektion gelernt.

0 Stimmen

Das ist genial :)

0 Stimmen

Es ist nicht wirklich brillant, wenn Sie mitten in einem Merge waren, Zweige erstellt hatten oder irgendwelche Commits seit dem Klonen herausgegeben hatten, oder eines einer Reihe anderer Szenarien... Eine neue Kopie des Repos zu klonen ist kaum eine Lösung und ich wage zu behaupten, dass es nach Ungeduld riecht (am besten, wenn man wirklich in der Klemme sitzt). Es ist viel besser, herauszufinden, was los ist, und den Index des bestehenden Repos zu reparieren - das ist normalerweise relativ einfach zu machen. Manchmal kann man die Indexdatei einfach umbenennen (oder löschen, wenn man sicher ist, dass man sie nie wieder braucht) und Git eine neue Datei erstellen lassen (mit git-reset oder git-checkout)...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X