Comment résoudre «Erreur: mauvais index - Fatal: fichier d'index corrompu» lors de l'utilisation de Git

612

Après git init, j'ai ajouté et validé quelques fichiers, apporté des modifications, ajouté et validé. Configurez le démon git (exécuté sous Cygwin sur WinXP) et clonez le référentiel une fois. Maintenant, j'obtiens cette erreur avec le référentiel cloné:

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

Y a-t-il un moyen de résoudre ce problème, à part obtenir une nouvelle copie du référentiel?

Numéro8
la source
Est-ce dans le référentiel cloné ou dans le référentiel d'origine? La commande clone a-t-elle généré des erreurs?
CB Bailey

Réponses:

1259

Si le problème est lié à l'index comme zone de transit pour les validations (c'est-à-dire .git/index), vous pouvez simplement supprimer l'index (faire une copie de sauvegarde si vous le souhaitez), puis restaurer l'index dans la version lors de la dernière validation:

Sous OSX / Linux:

rm -f .git/index
git reset

Sous Windows:

del .git\index
git reset

(La resetcommande ci-dessus est la même que git reset --mixed HEAD)

Vous pouvez également utiliser la plomberie de niveau inférieur au git read-treelieu de git reset.


Si le problème est lié à l' index du packfile , vous pouvez le récupérer à l'aide de git index-pack.

Jakub Narębski
la source
27
J'ai accidentellement fait un :w!dans un :Gstatus(de fugitive.vim). Cette réponse m'a évité de tirer beaucoup de cheveux.
Laurence Gonsalves
5
Je sais que nous n'aimons pas les messages "moi aussi" - mais "moi aussi". Équivalent dans Windows erase /s .git\index, j'en avais besoin erase .git\index.lockaussi.
Jeremy McGee
1
Salut, j'ai eu le même problème avec find et replace mais git reset me dit qu'il y a deux fichiers pack dans .git / objects / pack / qui ne sont pas accessibles. Avez-vous une idée ?
epsilones
13
ne serait-il pas plus sûr d'utiliser à la git reset --keepplace? Dans la feuille de triche Tower Git, il est expliqué comme
suit
10
Elle n'existait pas lorsque j'écrivais cette réponse ... Quoi qu'il en soit, git reset --keepc'est une forme plus sûre de git reset --hard; git reset --mixedne touche pas du tout à workdir.
Jakub Narębski
76

Vous avez peut-être accidentellement corrompu le fichier .git / index avec un sed à la racine de votre projet (refactoring peut-être?) Avec quelque chose comme:

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

pour éviter cela à l'avenir, ignorez simplement les fichiers binaires avec votre grep / sed:

sed -ri -e "s/$SEACHPATTERN/$REPLACEMENTTEXT/g" $(grep -Elr --binary-files=without-match "$SEARCHPATERN" "$PROJECTROOT")
plaques de cuisson
la source
6
Si cela ne vous dérange pas de perdre des modifications dans .git/index, vous pouvez toujours le supprimer et recréer avec git reset(sans --hard!).
Jakub Narębski
1
Je l'ai cassé avec # find ./ -type f -exec sed -i 's / Politician / Legislator / g' {} \; Faire ce que cette réponse recommande ne l'aurait pas brisé en premier lieu, mais la réponse acceptée a réparé les dommages que j'ai causés. C'est cependant une excellente prévention.
Ryan Mortensen
1
@RyanMortensen Vous pouvez essayer d'inverser votre sedavec quelque chose comme find .git/ -type f -exec sed -i 's/Legislator/Politician/g' {} \; cela pourrait aider si votre .git/est si corrompu que git resetcela ne fonctionnera pas. Ou peut-être souhaitez-vous restaurer votre existant .git/indexsans le supprimer. Cela échouera, bien sûr, si votre code ou index d'origine contenait déjà des «législateurs».
plaques
1
Merci @hobs, vous m'avez sauvé beaucoup de problèmes - je l'ai résolu en inversant le seden remplaçant mon new_stringpar mon old_string!
tsveti_iko
1
J'ai refactorisé tout mon projet au lieu du dossier 'src' dans IntelliJ et j'ai eu ce problème. Cela explique pourquoi j'ai eu des erreurs si étranges!
Michael
18

J'ai eu ce problème, et j'essaie de résoudre ce problème:

rm -f .git/index
git reset

Mais cela n'a pas fonctionné. La solution ? Pour une raison quelconque, j'avais d'autres dossiers .git dans des sous-répertoires. Je supprime ces dossiers .git (pas le principal) et git resetencore. Une fois supprimés, tout fonctionnait à nouveau.

Cleiton Almeida
la source
15

Cela ressemble à un mauvais clone. Vous pouvez essayer ce qui suit pour obtenir (éventuellement?) Plus d'informations:

git fsck --full
Gav
la source
8

Étant donné que les solutions ci-dessus m'ont laissé des problèmes continus, j'ai utilisé cette solution terne:

  1. cloner une nouvelle copie du dépôt ailleurs
  2. copiez le nouveau répertoire .git dans le repo (cassé) qui contenait les modifications que je voulais valider

A fait l'affaire. Btw, j'ai fait un sedsur la racine du projet comme l'a deviné @hobs. J'ai appris ma leçon.

eskimwier
la source
C'est génial :)
Jeremy Belolo
Ce n'est pas vraiment génial si vous étiez au milieu d'une fusion, si vous aviez créé des succursales ou émis des commits depuis le clonage, ou l'un des nombreux autres scénarios ... Le clonage d'une nouvelle copie du dépôt n'est guère une solution et j'ose dire ça sent l'impatience (il vaut mieux le laisser dans un vrai pincement). Il est préférable de diagnostiquer ce qui se passe et de réparer l'index du référentiel existant - ce qui est généralement relativement facile à faire. Parfois, vous pouvez simplement renommer le fichier d'index (ou le supprimer, si vous êtes sûr que vous n'en aurez plus jamais besoin) et laisser Git en créer un nouveau (en utilisant git-reset ou git-checkout) ..
Jazimov
7

Cela a fonctionné pour moi. Bien que je sois curieux de savoir pourquoi j'ai commencé à obtenir les erreurs en premier lieu. Hier, quand je me suis déconnecté, ça allait. Connectez-vous ce matin, ce n'était pas le cas.

rm .git/index

git reset
Quatre-vingts
la source
Cela a fonctionné pour moi, bien qu'il ait supprimé tous les fichiers ajoutés de git. J'ai dû exécuter git add pour ces fichiers
Shamsul Arefin Sajib
6

Remarque pour les utilisateurs de sous-modules git - les solutions ici ne fonctionneront pas pour vous en l'état.

Supposons que vous ayez un référentiel parent appelé dev, par exemple, et que votre référentiel de sous-module soit appelé api.

si vous êtes à l'intérieur de apiet vous obtenez l'erreur mentionnée dans cette question:

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

Le indexfichier ne sera PAS dans un .gitdossier. En fait, le .gitne sera même pas un dossier - ce sera un document texte avec l'emplacement des vraies données .git pour ce référentiel. Probablement quelque chose comme ça:

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

Donc, au lieu de rm -f .git/index, vous devrez faire ceci:

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

ou, plus généralement,

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

jenming
la source
4

Ce problème peut se produire lorsqu'un .gitrépertoire se trouve sous l'un des sous-répertoires. Pour le corriger, vérifiez s'il existe d'autres répertoires .git, supprimez-les et réessayez.

Nick Kuijpers
la source
Plusieurs autres réponses ont déjà fourni ces informations.
Simon Forsberg
-1

J'ai fait un truc simple. Je clone le dépôt dans un nouveau dossier. Copiez le dossier .git du nouveau dossier dans l'ancien dossier du repo, en remplaçant .git.

Astra Uvarova - L'étoile de Saturne
la source
Très dangereux car il supprimera les données comme les commits non publiés, les balises et les branches ainsi que les stashes et le reflog.
Koraktor
Je ne suis pas sûr des validations non publiées car je pense qu'elles sont stockées dans le dossier .git et j'ai copié le dossier .git. Je n'ai rien perdu avec cette méthode. Je ne connais pas les cachettes et reflog pour faire des commentaires à ce sujet.
Astra Uvarova - L'étoile de Saturne
Vous avez raison, mais vous devriez peut-être souligner que vous avez fait un clone local. Mais mon commentaire est toujours vrai pour les cachettes et le reflog.
Koraktor
D'accord, je n'ai aucune expérience sur ce commentaire, cependant, cela a fonctionné pour moi et certains utilisateurs pourraient le trouver utile. Il n'est pas nécessaire de le voter.
Astra Uvarova - L'étoile de Saturne
-7

C'est ridicule mais je viens de redémarrer ma machine (mac) et le problème a disparu comme s'il ne s'était jamais produit. Je déteste ressembler à un gars de soutien ...

Herman Leus
la source
-9

Vous pouvez également essayer de restaurer la version précédente du fichier (si vous utilisez Windows OS)

Shyamsundar
la source
1
Ne mettez pas de réponse que vous ne connaissez pas.
Altaf Patel