Come risolvere "Errore: indice errato - Fatale: file indice corrotto" quando si utilizza Git


612

Successivamente git init, ho aggiunto e eseguito il commit di alcuni file, apportato alcune modifiche, aggiunto e impegnato. Configurare il demone git (in esecuzione su Cygwin su WinXP) e clonato il repository una volta. Ora, ottengo questo errore con il repository clonato:

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

Esiste un modo per risolvere questo problema, oltre a ottenere una nuova copia del repository?


È presente nel repository clonato o nel repository originale? Il comando clone ha generato errori?
CB Bailey,

Risposte:


1259

Se il problema riguarda l'indice come area di gestione temporanea per i commit (ad es. .git/index), Puoi semplicemente rimuovere l'indice (crea una copia di backup se lo desideri), quindi ripristinare l'indice nella versione nell'ultimo commit:

Su OSX / Linux:

rm -f .git/index
git reset

Su Windows:

del .git\index
git reset

(Il resetcomando sopra è lo stesso di git reset --mixed HEAD)

In alternativa, puoi utilizzare un impianto idraulico di livello inferiore git read-treeanziché git reset.


Se il problema riguarda l' indice per packfile , è possibile recuperarlo utilizzando git index-pack.


27
Ho accidentalmente fatto un :w!in a :Gstatus(da fugitive.vim). Questa risposta mi ha fatto risparmiare un sacco di capelli.
Laurence Gonsalves,

5
So che non ci piacciono i messaggi "anch'io", ma "anche io". Equivalente in Windows erase /s .git\index, ne avevo bisogno erase .git\index.lockanche io .
Jeremy McGee,

1
Ciao, ho avuto lo stesso problema con trova e sostituisci ma git reset mi dice che ci sono due file pack in .git / objects / pack / a cui non è possibile accedere. Hai un'idea ?
epsilones,

13
non sarebbe più sicuro da usare git reset --keepinvece? Nel Cheat Sheet di Tower Git è spiegato come: Ripristina il puntatore HEAD a un commit precedente e conserva le modifiche locali non confermate
Pjetr

10
Non esisteva quando stavo scrivendo questa risposta ... Comunque git reset --keepè una forma più sicura di git reset --hard; git reset --mixednon tocca affatto workdir.
Jakub Narębski,

76

Potresti aver accidentalmente corrotto il file .git / index con un sed sulla radice del tuo progetto (refactoring forse?) Con qualcosa del tipo:

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

per evitarlo in futuro, basta ignorare i file binari con grep / sed:

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

6
Se non ti dispiace perdere le modifiche .git/index, puoi sempre eliminarlo e ricrearlo con git reset(senza --hard!).
Jakub Narębski

1
L'ho rotto con # find ./ -type f -exec sed -i 's / Politician / Legislator / g' {} \; Fare ciò che raccomanda questa risposta non lo avrebbe rotto in primo luogo, ma la risposta accettata ha riparato il danno che ho fatto. Questa è un'ottima prevenzione però.
Ryan Mortensen,

1
@RyanMortensen Potresti provare a invertire sedqualcosa come find .git/ -type f -exec sed -i 's/Legislator/Politician/g' {} \; Questo potrebbe aiutare se sei .git/così corrotto che git resetnon funzionerà. O forse vuoi ripristinare il tuo esistente .git/indexsenza eliminarlo. Ciò fallirà, ovviamente, se il tuo codice o indice originale conteneva già alcuni "Legislatori".
piani cottura

1
Grazie @hobs mi hai salvato un sacco di problemi - l'ho risolto invertendo il sedmio sostituendo il mio new_stringcon il mio old_string!
tsveti_iko,

1
Ho refactored il mio intero progetto invece della cartella 'src' in IntelliJ e ho avuto questo problema. Questo spiega perché ho avuto errori così strani!
Michael

18

Ho avuto questo problema e provo a risolvere questo problema:

rm -f .git/index
git reset

Ma non ha funzionato. La soluzione ? Per qualche ragione avevo altre cartelle .git in sottodirectory. Elimina quelle cartelle .git (non le principali) e di git resetnuovo. Una volta eliminati, tutto ha funzionato di nuovo.


15

Sembra un brutto clone. Potresti provare quanto segue per ottenere (forse?) Ulteriori informazioni:

git fsck --full

8

Poiché le soluzioni di cui sopra mi hanno lasciato con problemi continui, ho usato questa soluzione noiosa:

  1. clonare una nuova copia del repository altrove
  2. copia la nuova directory .git nel repository (interrotto) che conteneva le modifiche che volevo eseguire il commit

Ha fatto il trucco. A proposito, ho fatto un sedroot sul progetto come @hobs ha indovinato. Ho imparato la mia lezione


È geniale :)
Jeremy Belolo,

Non è davvero geniale se ti trovassi nel bel mezzo di una fusione, avessi creato filiali o avessi emesso dei commit dalla clonazione, o uno di alcuni altri scenari ... Clonare una nuova copia del repository non è certo una soluzione e oserei dire sa di impazienza (meglio lasciarlo quando si è in un vero pizzico). È molto meglio diagnosticare effettivamente ciò che sta succedendo e riparare l'indice del repository esistente - di solito è relativamente facile da fare. A volte puoi semplicemente rinominare il file indice (o eliminarlo, se sei sicuro di non averne più bisogno) e lasciare che Git ne crei uno nuovo (usando git-reset o git-checkout) ..
Jazimov

7

Questo ha funzionato per me. Anche se sono curioso del motivo per cui ho iniziato a ottenere gli errori in primo luogo. Quando mi sono disconnesso ieri, andava bene. Accedi stamattina, non lo era.

rm .git/index

git reset

Questo ha funzionato per me, sebbene abbia rimosso tutti i file aggiunti da Git. Ho dovuto eseguire git add per quei file
Shamsul Arefin Sajib il

6

Nota per gli utenti di git submodule: le soluzioni qui non funzioneranno così come sono.

Supponiamo che tu abbia un repository padre chiamato dev, ad esempio, e il tuo repository sottomodulo sia chiamato api.

se sei all'interno di apie ricevi l'errore menzionato in questa domanda:

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

Il indexfile NON sarà all'interno di una .gitcartella. In realtà, .gitnon sarà nemmeno una cartella: sarà un documento di testo con la posizione dei dati reali .git per questo repository. Probabilmente qualcosa del genere:

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

Quindi, invece di rm -f .git/index, dovrai fare questo:

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

o, più in generale,

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


4

Questo problema può verificarsi quando è presente una .gitdirectory sotto una delle sottodirectory. Per risolverlo, controlla se ci sono altre directory .git lì, rimuovile e riprova.


Diverse altre risposte hanno già fornito queste informazioni.
Simon Forsberg,

-1

Ho fatto un semplice trucco. Clono il repository in una nuova cartella. Copiato la cartella .git dalla nuova cartella nella vecchia cartella del repository, sostituendo lì .git.


Molto pericoloso perché eliminerà dati come commit, tag e rami non pubblicati, nonché stash e reflog.
Koraktor,

Non sono sicuro delle commit non pubblicate poiché credo che siano archiviate nella cartella .git e che abbia copiato la cartella .git. Non ho perso nulla con questo metodo. Non conosco cali e reflog per fare commenti al riguardo.
Astra Uvarova - La stella di Saturno

Hai ragione, ma forse dovresti sottolineare che hai fatto un clone locale. Ma il mio commento è ancora vero per stash e reflog.
Koraktor

Va bene, non ho ulteriori esperienze su quel commento, tuttavia, ha funzionato per me e alcuni utenti potrebbero trovarlo utile. Non è necessario ridimensionarlo.
Astra Uvarova - La stella di Saturno il


-7

Questo è ridicolo ma ho appena riavviato la mia macchina (mac) e il problema era sparito come non è mai successo. Odio sembrare un ragazzo di supporto ...


-9

Puoi anche provare a ripristinare la versione precedente del file (se stai utilizzando il sistema operativo Windows)


1
Non dare una risposta che non conosci.
Altaf Patel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.