Como resolver "Erro: índice incorreto - Fatal: arquivo de índice corrompido" ao usar o Git

611

Depois git init, adicionei e enviei alguns arquivos, fiz algumas alterações, adicionei e confirmei. Configure o daemon git (executando o Cygwin no WinXP) e clonou o repositório uma vez. Agora, recebo esse erro com o repositório clonado:

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

Existe alguma maneira de corrigir isso, além de obter uma nova cópia do repositório?

Número8
fonte
Isso está no repositório clonado ou no repositório original? O comando clone produziu algum erro?
22411 CB Bailey

Respostas:

1257

Se o problema estiver no índice como a área de preparação para confirmações (ou seja .git/index), você pode simplesmente remover o índice (fazer uma cópia de backup, se desejar) e restaurar o índice para a versão na última confirmação:

No OSX / Linux:

rm -f .git/index
git reset

No Windows:

del .git\index
git reset

(O resetcomando acima é o mesmo que git reset --mixed HEAD)

Em alternativa, pode utilizar canalizações de nível inferior em git read-treevez de git reset.


Se o problema estiver no índice para o packfile , você pode recuperá-lo usando git index-pack.

Jakub Narębski
fonte
27
Eu acidentalmente fiz um :w!em um :Gstatus(de fugitive.vim). Essa resposta me salvou muito cabelo puxando.
Laurence Gonsalves
5
Sei que não gostamos de mensagens "eu também" - mas "eu também". Equivalente no Windows erase /s .git\index, eu também precisava de um erase .git\index.lock.
Jeremy McGee
1
Oi, Eu tive o mesmo problema com a localização e substituição, mas o git reset me diz que existem dois arquivos de pacote em .git / objects / pack / que não podem ser acessados. Você tem alguma ideia ?
epsilones
13
não seria mais seguro usá-lo git reset --keep? Na Folha Torre Git fraude é explicado como: Repor o ponteiro HEAD para um commit anterior e preservar as alterações locais não confirmadas
Pjetr
10
Não existia quando eu estava escrevendo esta resposta ... Enfim, git reset --keepé uma forma mais segura de git reset --hard; git reset --mixednão toca na workdir.
Jakub Narębski
76

Você pode ter acidentalmente corrompido o arquivo .git / index com um sed na raiz do projeto (refatorando talvez?) Com algo como:

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

para evitar isso no futuro, apenas ignore os arquivos binários com o seu grep / sed:

sed -ri -e "s/$SEACHPATTERN/$REPLACEMENTTEXT/g" $(grep -Elr --binary-files=without-match "$SEARCHPATERN" "$PROJECTROOT")
fogão
fonte
6
Se você não se importa em perder as alterações .git/index, sempre pode excluí-lo e recriar com git reset(sem --hard!).
Jakub Narębski
1
Eu o quebrei com # find ./ -type f -exec sed -i / Político / Legislador / g '{} \; Fazer o que esta resposta recomenda, não a quebraria em primeiro lugar, mas a resposta aceita reparou o dano que eu fiz. Esta é uma excelente prevenção embora.
Ryan Mortensen
1
@RyanMortensen Você pode tentar invertê-lo sedcom algo como find .git/ -type f -exec sed -i 's/Legislator/Politician/g' {} \; Isso pode ajudar se você .git/estiver tão corrompido que git resetnão funcionará. Ou talvez você queira restaurar o seu existente .git/indexsem excluí-lo. Isso irá falhar, é claro, se o seu código ou índice original já tiver alguns "legisladores" nele.
hobs
1
Obrigado @hobs, você me salvou de muitos problemas - eu resolvi invertendo o sedsubstituindo meu new_stringpelo meu old_string!
Tsveti_iko 11/07/2018
1
Refatorei todo o meu projeto em vez da pasta 'src' no IntelliJ e tive esse problema. Isso explica porque eu tive erros tão estranhos!
Michael
18

Eu tive esse problema e tento corrigir isso:

rm -f .git/index
git reset

Mas não funcionou. A solução ? Por alguma razão, eu tinha outras pastas .git em subdiretórios. Eu apago essas pastas .git (não a principal) e git resetnovamente. Uma vez excluídos, tudo funcionou novamente.

Cleiton Almeida
fonte
15

Isso soa como um clone ruim. Você pode tentar o seguinte para obter (possivelmente?) Mais informações:

git fsck --full
Gav
fonte
8

Como as soluções acima me deixaram com problemas contínuos, usei esta solução sem graça:

  1. clonar uma nova cópia do repositório em outro lugar
  2. copie o diretório .git novo para o repositório (quebrado) que continha as alterações que eu queria confirmar

Fiz o truque. Btw, eu fiz um sedna raiz do projeto como @hobs adivinhou. Aprendi minha lição.

eskimwier
fonte
Isso é brilhante :)
Jeremy Belolo
Não é realmente brilhante se você estivesse no meio de uma mesclagem, tivesse criado ramificações ou emitido quaisquer confirmações desde a clonagem, ou em vários outros cenários ... A clonagem de uma nova cópia do repositório dificilmente é uma solução, e eu diria cheira a impaciência (é melhor deixar quando está em uma verdadeira pitada). É muito melhor diagnosticar o que está acontecendo e reparar o índice do repositório existente - geralmente é relativamente fácil de fazer. Às vezes, você pode simplesmente renomear o arquivo de índice (ou excluí-lo, se tiver certeza de que nunca mais precisará dele) e deixar o Git criar um novo (usando git-reset ou git-checkout) ..
Jazimov
7

Isso funcionou para mim. Embora eu esteja curioso sobre o motivo, comecei a receber os erros em primeiro lugar. Quando eu saí ontem, estava tudo bem. Entre hoje de manhã, não foi.

rm .git/index

git reset
Oitenta
fonte
Isso funcionou para mim, embora tenha removido todos os arquivos adicionados do git. Eu tive que correr add git para esses arquivos
Shamsul Arefin Sajib
6

Nota para usuários do submódulo git - as soluções aqui não funcionarão para você como está.

Digamos que você tenha um repositório pai chamado dev, por exemplo, e seu repositório de submodulo é chamado api.

se você estiver dentro apie receber o erro mencionado nesta pergunta:

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

O indexarquivo NÃO estará dentro de uma .gitpasta. De fato, .gitnem será uma pasta - será um documento de texto com a localização dos dados .git reais para este repositório. Provavelmente algo como isto:

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

Então, em vez de rm -f .git/index, você precisará fazer o seguinte:

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

ou, de maneira mais geral,

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

Jenming
fonte
4

Esse problema pode ocorrer quando há um .gitdiretório abaixo de um dos subdiretórios. Para corrigi-lo, verifique se há outros diretórios .git lá, remova-os e tente novamente.

Nick Kuijpers
fonte
Várias outras respostas já forneceram essas informações.
Simon Forsberg 26/03
-1

Eu fiz um truque simples. Clono o repositório para uma nova pasta. Copiou a pasta .git da nova pasta para a pasta antiga do repositório, substituindo .git lá.

Astra Uvarova - estrela de Saturno
fonte
Muito perigoso, pois excluirá dados como confirmações, tags e ramificações não publicadas, além de stashes e reflog.
Koraktor
Não tenho certeza sobre confirmações não publicadas, pois acredito que elas estão armazenadas na pasta .git e copiei a pasta .git. Não perdi nada com esse método. Eu não sei sobre stashes e reflog para fazer comentários sobre isso.
Astra Uvarova - estrela de Saturno
Você está correto, mas talvez você deva enfatizar que criou um clone local. Mas meu comentário ainda é verdadeiro para esconderijos e reflog.
Koraktor
Ok, não tenho mais experiência nesse comentário, no entanto, funcionou para mim e alguns usuários podem achar útil. Não há necessidade de voto negativo.
Astra Uvarova - estrela de Saturno
-7

Isso é ridículo, mas acabei de reiniciar minha máquina (mac) e o problema desapareceu como se nunca tivesse acontecido. Eu odeio parecer um cara de apoio ...

Herman Leus
fonte
-9

Você também pode tentar restaurar a versão anterior do arquivo (se estiver usando o sistema operacional Windows)

Shyamsundar
fonte
1
Não coloque uma resposta que você não sabe.
Altaf Patel