Cómo resolver "Error: índice incorrecto - Fatal: archivo de índice dañado" cuando se usa Git

612

Después git init, agregué y comprometí algunos archivos, hice algunos cambios, agregué y comprometí. Configure el demonio git (que se ejecuta bajo Cygwin en WinXP) y clone el repositorio una vez. Ahora, recibo este error con el repositorio clonado:

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

¿Hay alguna forma de arreglar esto, aparte de obtener una nueva copia del repositorio?

Numero 8
fuente
¿Está esto en el repositorio clonado o en el repositorio original? ¿El comando clon produjo algún error?
CB Bailey

Respuestas:

1259

Si el problema es con el índice como el área de preparación para las confirmaciones (es decir .git/index), simplemente puede eliminar el índice (hacer una copia de seguridad si lo desea) y luego restaurar el índice a la versión en la última confirmación:

En OSX / Linux:

rm -f .git/index
git reset

En Windows:

del .git\index
git reset

(El resetcomando anterior es el mismo que git reset --mixed HEAD)

Alternativamente, puede usar plomería de nivel inferior en git read-treelugar de git reset.


Si el problema es con el índice para el paquete de archivos , puede recuperarlo usando git index-pack.

Jakub Narębski
fuente
27
Accidentalmente hice un :w!en un :Gstatus(de fugitive.vim). Esta respuesta me ahorró mucho tirón del cabello.
Laurence Gonsalves
55
Sé que no nos gustan los mensajes "yo también", sino "yo también". Equivalente en Windows es erase /s .git\index, yo también necesitaba un erase .git\index.lock.
Jeremy McGee
1
Hola, tuve el mismo problema con buscar y reemplazar, pero git reset me dice que hay dos archivos de paquete en .git / objects / pack / a los que no se puede acceder. Tienes una idea ?
epsilones
13
¿no sería más seguro usarlo git reset --keepen su lugar? En la hoja de trucos de Tower Git se explica como: Restablezca el puntero HEAD a un commit anterior y conserve los cambios locales no confirmados
Pjetr
10
No existía cuando estaba escribiendo esta respuesta ... De todos modos git reset --keepes una forma más segura de git reset --hard; git reset --mixedno toca workdir en absoluto.
Jakub Narębski
76

Es posible que haya dañado accidentalmente el archivo .git / index con un sed en la raíz de su proyecto (¿quizás refactorizando?) Con algo como:

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

para evitar esto en el futuro, simplemente ignore los archivos binarios con su grep / sed:

sed -ri -e "s/$SEACHPATTERN/$REPLACEMENTTEXT/g" $(grep -Elr --binary-files=without-match "$SEARCHPATERN" "$PROJECTROOT")
placas
fuente
66
Si no le importa perder los cambios .git/index, siempre puede eliminarlo y volver a crearlo git reset( --hard¡ sin !).
Jakub Narębski
1
Lo rompí con # find ./ -type f -exec sed -i 's / Politician / Legislator / g' {} \; Hacer lo que esta respuesta recomienda no lo habría roto en primer lugar, pero la respuesta aceptada reparó el daño que hice. Sin embargo, esta es una excelente prevención.
Ryan Mortensen
1
@RyanMortensen Podría intentar invertir su sedcon algo como find .git/ -type f -exec sed -i 's/Legislator/Politician/g' {} \; Esto podría ayudar si .git/está tan dañado que git resetno funcionará. O tal vez desee restaurar su existente .git/indexsin eliminarlo. Esto fallará, por supuesto, si su código o índice original ya tenía algunos "Legisladores".
placas
1
Gracias @hobs, me ahorraste muchos problemas. Lo resolví invirtiendo el sedreemplazo de mi new_stringcon mi old_string.
tsveti_iko
1
Refactoré todo mi proyecto en lugar de la carpeta 'src' en IntelliJ y tuve este problema. ¡Esto explica por qué tuve errores tan extraños!
Michael
18

Tuve ese problema y trato de solucionarlo con esto:

rm -f .git/index
git reset

Pero no funcionó. La solución ? Por alguna razón, tenía otras carpetas .git en subdirectorios. Elimino esas carpetas .git (no el principal) y git resetotra vez. Una vez que se eliminaron, todo volvió a funcionar.

Cleiton Almeida
fuente
15

Esto suena como un mal clon. Puede intentar lo siguiente para obtener (¿posiblemente?) Más información:

git fsck --full
Gav
fuente
8

Como las soluciones anteriores me dejaron con problemas continuos, utilicé esta solución aburrida:

  1. clonar una nueva copia del repositorio en otro lugar
  2. copie el directorio .git nuevo en el repositorio (roto) que contenía los cambios que quería confirmar

Hizo el truco. Por cierto, hice un seden la raíz del proyecto como @hobs supuso. Aprendí mi lección.

Eskimwier
fuente
Eso es genial :)
Jeremy Belolo
No es realmente brillante si estuvieras en medio de una fusión, hubieras creado sucursales o hubieras emitido confirmaciones desde la clonación, o cualquiera de varios otros escenarios ... Clonar una nueva copia del repositorio no es una solución y me atrevo a decir huele a impaciencia (es mejor dejarlo cuando está en apuros). Es mucho mejor diagnosticar realmente lo que está sucediendo y reparar el índice de repositorio existente, que generalmente es relativamente fácil de hacer. A veces, puede cambiar el nombre del archivo de índice (o eliminarlo, si está seguro de que nunca más lo volverá a necesitar) y dejar que Git cree uno nuevo (usando git-reset o git-checkout) ..
Jazimov
7

Esto funcionó para mí. Aunque tengo curiosidad por la razón por la que comencé a recibir los errores en primer lugar. Cuando cerré sesión ayer, estaba bien. Inicie sesión esta mañana, no fue así.

rm .git/index

git reset
Ochenta
fuente
Esto funcionó para mí, aunque eliminó todos los archivos agregados de git. Tuve que ejecutar git add para esos archivos
Shamsul Arefin Sajib
6

Nota para los usuarios de submódulos git: las soluciones aquí no funcionarán para usted tal cual.

Supongamos que tiene un repositorio principal llamado dev, por ejemplo, y se llama a su repositorio de submódulos api.

si está dentro apiy obtiene el error mencionado en esta pregunta:

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

El indexarchivo NO estará dentro de una .gitcarpeta. De hecho, .gitni siquiera será una carpeta, será un documento de texto con la ubicación de los datos .git reales para este repositorio. Probablemente algo como esto:

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

Entonces, en lugar de rm -f .git/index, deberá hacer esto:

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

o, más generalmente,

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

jenming
fuente
4

Este problema puede ocurrir cuando hay un .gitdirectorio debajo de uno de los subdirectorios. Para solucionarlo, verifique si hay otros directorios .git allí, elimínelos e intente nuevamente.

Nick Kuijpers
fuente
Varias otras respuestas ya han proporcionado esta información.
Simon Forsberg
-1

Hice un simple truco. Clono el repositorio en una nueva carpeta. Copió la carpeta .git de la nueva carpeta a la carpeta antigua del repositorio, reemplazando .git allí.

Astra Uvarova - la estrella de Saturno
fuente
Muy peligroso porque eliminará datos como confirmaciones, etiquetas y ramificaciones no publicadas, así como escondites y el registro.
Koraktor
No estoy seguro acerca de los commits no publicados, ya que creo que están almacenados en la carpeta .git y copié la carpeta .git. No perdí nada con este método. No sé acerca de los escondites y el registro de nuevo para hacer algún comentario al respecto.
Astra Uvarova - La estrella de Saturno
Tienes razón, pero quizás deberías enfatizar que hiciste un clon local. Pero mi comentario aún es cierto para los escondites y el registro.
Koraktor
De acuerdo, no tengo más experiencia en ese comentario, sin embargo, funcionó para mí y algunos usuarios podrían encontrarlo útil. No hay necesidad de denunciarlo.
Astra Uvarova - La estrella de Saturno el
-7

Esto es ridículo, pero acabo de reiniciar mi máquina (mac) y el problema desapareció como si nunca hubiera sucedido. Odio sonar como un tipo de apoyo ...

Herman Leus
fuente
-9

También puede intentar restaurar a la versión anterior del archivo (si está utilizando Windows OS)

Shyamsundar
fuente
1
No pongas respuesta que no sabes.
Altaf Patel