2009-07-12 15 views
442

Después de git init, agregué y cometí algunos archivos, realicé algunos cambios, agregué y me comprometí. Configure el daemon git (que se ejecuta bajo Cygwin en WinXP) y cloné el repositorio una vez. Ahora, me sale este error con el repositorio clonado:Cómo resolver "Error: índice incorrecto - Fatal: archivo de índice dañado" al usar Git

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

¿Hay alguna manera de solucionar este problema, aparte de conseguir una nueva copia del repositorio?

+0

Es esto en el repositorio clonado, o en el repositorio original? ¿El comando clon produjo algún error? –

Respuesta

884

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

en OSX/Linux:

rm -f .git/index 
git reset 

en Windows:

del .git\index 
git reset 

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

Alternativamente, puede utilizar nivel inferior plumbinggit read-tree en lugar de git reset.


Si el problema es con índice para packfile, puede recuperarla usando git index-pack.

+25

Accidentalmente hice un ': w!' En un ': Gstatus' (de fugitive.vim). Esta respuesta me ahorró un montón de tirones de cabello. –

+3

Sé que no nos gustan los mensajes "yo también", sino "yo también". Equivalente en Windows es 'erase/s .git \ index', también necesitaba' borrar .git \ index.lock'. –

+0

Tuve que usar rm .git/index porque recibí una advertencia ambigua usando -f –

12

Esto suena como un clon malo. Se podría intentar lo siguiente para obtener más información (posiblemente?):

git fsck --full 
68

Es posible que haya dañado accidentalmente el archivo .git/índice con una sed en su raíz del proyecto (refactorización tal vez?) Con algo como:

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

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

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

Si no te importa perder cambios en '.git/index', siempre puedes eliminarlo y recrear con 'git reset' (sin' --hard'!). –

+1

Lo rompí con # find ./ -type f -exec sed -i 's/Politician/Legislator/g' {} \; Hacer lo que esta respuesta recomienda, esto 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. –

+0

@RyanMortensen Puede intentar invertir su 'sed' con algo como' find .git/-type f -exec sed -i 's/Legislator/Politician/g' {} \; 'Esto podría ayudar si su' .git/'está tan dañado que' git reset' no funcionará. O tal vez quiera restaurar su '.git/index' existente sin eliminarlo. Esto fallará, por supuesto, si su código o índice original ya tiene algunos "Legisladores". – hobs

-6

también puede tratar de restaurar a la versión anterior del archivo (si está utilizando el sistema operativo windows)

+0

No pongas la respuesta que no sabes. –

6

que tenía ese problema, y ​​yo trato de arreglar con tI esto:

rm -f .git/index 
git reset 

PERO no funcionó. La solución? Por alguna razón, tenía otras carpetas .git en subdirectorios. Borro esas carpetas .git (no el principal) y git reset nuevamente. Una vez que se eliminaron, todo funcionó de nuevo.

9

En mi caso fue anidado carpeta .git en web/CKEditor/kcfinder

git status 
    error: bad index file sha1 signature 
    fatal: index file corrupt 
    fatal: 'git status --porcelain' failed in submodule web/ckeditor/kcfinder 
+1

Si esta es la causa del problema, inmediatamente después de ejecutar 'git reset', el archivo de índice se volvería a dañar ... En el resultado que publicó, la carpeta .git anidada en cuestión sería' web/ckeditor/kcfinder /. git' (git te dice dónde ubicar la carpeta en la tercera línea) ,. Debería eliminar la carpeta y ejecutar 'git reset' después –

3

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

2

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

rm .git/index 

git reset 
2

Dado que las soluciones anteriores me dejó con problemas continuos, que utiliza esta solución opaca:

  1. clon de una nueva copia de la cesión temporal en otro lugar
  2. copiar el directorio .git fresco en el (roto) Repo que contenía los cambios que quería confirmar

Hice el truco. Por cierto, hice un sed en la raíz del proyecto como @hobs guesssed. Aprendí mi lección

+0

Eso es brillante :) –

+0

No es realmente brillante si estaba en el medio de una combinación, había creado ramas o había emitido algún commit desde la clonación, o cualquiera de varios otros escenarios ... Clonar una nueva copia del repositorio no es una solución y me atrevería a decir que huele a impaciencia (es mejor dejarla en un aprieto real). Es mucho mejor diagnosticar realmente lo que está sucediendo y reparar el índice de repositorio existente; por lo general, es relativamente fácil de hacer. A veces puedes cambiar el nombre del archivo de índice (o eliminarlo, si estás seguro de que no lo necesitarás nunca más) y dejar que Git cree uno nuevo (usando git-reset o git-checkout). – Jazimov

-1

Esto es ridículo, pero acabo de reiniciar mi máquina (mac) y el problema desapareció como nunca antes. Odio sonar como un individuo de la ayuda ...

0

Nota para los usuarios Git submódulo - las soluciones aquí no va a funcionar para usted como está.

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

si se encuentra dentro de api y se obtiene el error mencionado en esta pregunta:

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

El archivo index no va a estar dentro de una carpeta .git. De hecho, el .git ni 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

Así, en lugar de rm -f .git/index, que se necesitan para 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

Cuestiones relacionadas