Git: "Objeto suelto corrupto"

Resuelto asgerhallas asked hace 13 años • 34 respuestas

Cada vez que uso mi control remoto, aparece el siguiente error sobre la compresión. Cuando ejecuto la compresión manual, obtengo lo mismo:

$ git gc
error: Could not read 3813783126d41a3200b35b6681357c213352ab31
fatal: bad tree object 3813783126d41a3200b35b6681357c213352ab31
error: failed to run repack

¿Alguien sabe qué hacer al respecto?

De cat-file obtengo esto:

$ git cat-file -t 3813783126d41a3200b35b6681357c213352ab31
error: unable to find 3813783126d41a3200b35b6681357c213352ab31
fatal: git cat-file 3813783126d41a3200b35b6681357c213352ab31: bad file

Y de git fsck obtengo esto (no sé si realmente está relacionado):

$ git fsck
error: inflate: data stream error (invalid distance too far back)
error: corrupt loose object '45ba4ceb93bc812ef20a6630bb27e9e0b33a012a'
fatal: loose object 45ba4ceb93bc812ef20a6630bb27e9e0b33a012a (stored in .git/objects/45/ba4ceb93bc812ef20a6630bb27e9e0b33a012a) is corrupted

¿Alguien puede ayudarme a descifrar esto?

asgerhallas avatar Nov 23 '10 16:11 asgerhallas
Aceptado

Tuve el mismo problema (no sé por qué).

Esta solución requiere acceso a una copia remota no dañada del repositorio y mantendrá intacta su copia de trabajo local.

Pero tiene algunos inconvenientes:

  • Perderá el registro de cualquier confirmación que no haya sido enviada y tendrá que volver a confirmarla.
  • Perderás todos los alijos.

La solución

Ejecute estos comandos desde el directorio principal encima de su repositorio (reemplace 'foo' con el nombre de la carpeta de su proyecto):

  1. Cree una copia de seguridad del directorio corrupto:
    cp -R foo foo-backup
  2. Haga un nuevo clon del repositorio remoto en un nuevo directorio:
    git clone [email protected]:foo foo-newclone
  3. Elimine el subdirectorio .git corrupto:
    rm -rf foo/.git
  4. Mueva el subdirectorio .git recién clonado a foo:
    mv foo-newclone/.git foo
  5. Elimina el resto del nuevo clon temporal:
    rm -rf foo-newclone

En Windows necesitarás usar:

  • copyen lugar decp -R
  • rmdir /Sen lugar derm -rf
  • moveen lugar demv

Ahora foo ha .gitrecuperado su subdirectorio original, pero todos los cambios locales siguen ahí. git status, commit, pull, push, etc. vuelven a funcionar como deberían.

cubic lettuce avatar Dec 17 '2012 16:12 cubic lettuce

Probablemente su mejor opción sea simplemente volver a clonar desde el repositorio remoto (es decir, GitHub u otro). Desafortunadamente, perderá todas las confirmaciones no enviadas y los cambios ocultos; sin embargo, su copia de trabajo debería permanecer intacta.

Primero haga una copia de seguridad de sus archivos locales. Luego haga esto desde la raíz de su árbol de trabajo:

rm -fr .git
git init
git remote add origin [your-git-remote-url]
git fetch
git reset --mixed origin/master
git branch --set-upstream-to=origin/master master

Luego confirme los archivos modificados según sea necesario.

user1055643 avatar Aug 14 '2013 17:08 user1055643