Git: "Objeto suelto corrupto"
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?
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):
- Cree una copia de seguridad del directorio corrupto:
cp -R foo foo-backup
- Haga un nuevo clon del repositorio remoto en un nuevo directorio:
git clone [email protected]:foo foo-newclone
- Elimine el subdirectorio .git corrupto:
rm -rf foo/.git
- Mueva el subdirectorio .git recién clonado a foo:
mv foo-newclone/.git foo
- Elimina el resto del nuevo clon temporal:
rm -rf foo-newclone
En Windows necesitarás usar:
copy
en lugar decp -R
rmdir /S
en lugar derm -rf
move
en lugar demv
Ahora foo ha .git
recuperado su subdirectorio original, pero todos los cambios locales siguen ahí. git status
, commit
, pull
, push
, etc. vuelven a funcionar como deberían.
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.