812 votes

Comment résoudre le message "Error : bad index - Fatal : index file corrupt" lors de l'utilisation de Git ?

Après git init J'ai ajouté et validé quelques fichiers, fait quelques changements, ajouté et validé. J'ai configuré le démon git (fonctionnant sous Cygwin sur WinXP) et cloné le dépôt une fois. Maintenant, j'obtiens cette erreur avec le dépôt 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 ?

0 votes

Est-ce dans le référentiel cloné, ou dans le référentiel d'origine ? La commande de clonage a-t-elle produit des erreurs ?

1698voto

Jakub Narębski Points 87537

Si le problème vient de l'index comme la zone de transit pour les commits (c'est-à-dire .git/index ), vous pouvez simplement supprimer l'index (faites une copie de sauvegarde si vous le souhaitez), et ensuite restaurer l'index à la version du dernier commit :

Sur OSX/Linux/Windows (avec Git bash) :

rm -f .git/index
git reset

Sous Windows (avec CMD et non git bash) :

del .git\index
git reset

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

Vous pouvez également utiliser le niveau inférieur plomberie git read-tree au lieu de git reset .


Si le problème concerne indice pour fichier d'emballage vous pouvez le récupérer en utilisant git index-pack .

31 votes

J'ai accidentellement fait un :w! dans un :Gstatus (de fugitive.vim). Cette réponse m'a épargné beaucoup d'arrachage de cheveux.

6 votes

Je sais que nous n'aimons pas les messages "moi aussi" - mais "moi aussi". L'équivalent dans Windows est erase /s .git\index J'avais besoin d'un erase .git\index.lock aussi.

0 votes

J'ai dû utiliser rm .git/index car j'ai reçu un avertissement ambigu en utilisant -f

79voto

hobs Points 3020

Vous avez peut-être accidentellement corrompu le fichier .git/index avec un sed sur votre projet Root (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")

7 votes

Si cela ne vous dérange pas de perdre des changements dans .git/index vous pouvez toujours le supprimer et le recréer avec git reset (sans --hard !).

2 votes

Je l'ai cassé avec # find ./ -type f -exec sed -i 's/Politician/Legislator/g' {} \ ; En faisant ce que cette réponse recommande, je ne l'aurais pas cassé en premier lieu, mais la réponse acceptée a réparé les dommages que j'ai faits. C'est une excellente prévention.

1 votes

@RyanMortensen Vous pourriez essayer d'inverser votre sed avec quelque chose comme find .git/ -type f -exec sed -i 's/Legislator/Politician/g' {} \; Cela peut aider si votre .git/ est tellement corrompu que git reset ne fonctionnera pas. Ou peut-être que vous voulez restaurer votre .git/index sans l'effacer. Cela échouera, bien sûr, si votre code ou votre index d'origine contenait déjà des "législateurs".

31voto

Cleiton Almeida Points 272

J'ai eu ce problème, et j'ai essayé de le résoudre avec ça :

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. J'ai supprimé ces dossiers .git (pas le dossier principal) et git reset encore. Une fois qu'ils ont été supprimés, tout a fonctionné à nouveau.

21voto

Gav Points 3229

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

git fsck --full

18voto

eskimwier Points 645

Puisque les solutions ci-dessus m'ont laissé des problèmes persistants, j'ai utilisé cette solution terne :

  1. cloner une nouvelle copie du repo ailleurs
  2. copier le nouveau répertoire .git dans le repo (cassé) qui contenait les changements que je voulais livrer

Ça a marché. Au fait, j'ai fait un sed sur le projet Root comme @hobs l'a deviné. J'ai appris ma leçon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X