Cada vez que saco de 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?
git
version-control
asgerhallas
fuente
fuente
Respuestas:
Parece que tienes un objeto de árbol corrupto. Deberá obtener ese objeto de otra persona. Esperemos que tengan una versión incorrupta.
En realidad, podría reconstruirlo si no puede encontrar una versión válida de otra persona adivinando qué archivos deberían estar allí. Es posible que desee ver si las fechas y horas de los objetos coinciden. Esos podrían ser los blobs relacionados. Podría inferir la estructura del objeto del árbol a partir de esos objetos.
Echa un vistazo a las transmisiones de pantalla de Git de Scott Chacon sobre las partes internas de git. Esto le mostrará cómo funciona git debajo del capó y cómo hacer este trabajo de detective si realmente está atrapado y no puede obtener ese objeto de otra persona.
fuente
git cat-file -t <SHA1>
te dirá el tipo. Si no está dañado, puede hacerlogit cat-file <type> <SHA1>
para ver el contenido (lo usé para unblob
, supongo que también le mostrará el contenido de otros tipos).blob
. Cuando he seguido estas instrucciones, sin embargo,git status
responsedfatal: unable to read <SHA1>
pesar de que había corrió con éxitogit hash-object -w <file>
(probablemente porque, según sus instrucciones, me había trasladado ese archivo objeto de distancia Volviendo simplemente me dio la misma.corrupt loose object
Error.)Tuve el mismo problema (no sé por qué).
Esta solución requiere acceso a una copia remota no corrupta del repositorio y mantendrá intacta su copia de trabajo local.
Pero tiene algunos inconvenientes:
La solución
Ejecute estos comandos desde el directorio principal sobre su repositorio (reemplace 'foo' con el nombre de su carpeta de proyecto):
cp -R foo foo-backup
git clone [email protected]:foo foo-newclone
rm -rf foo/.git
mv foo-newclone/.git foo
rm -rf foo-newclone
En Windows deberá usar:
copy
en vez decp -R
rmdir /S
en vez derm -rf
move
en vez demv
Ahora foo tiene su
.git
subdirectorio original , pero todos los cambios locales siguen ahí.git status
,commit
,pull
,push
, Etc trabajo de nuevo como deberían.fuente
.git
carpeta.Su mejor opción es probablemente volver a clonar desde el repositorio remoto (es decir, Github u otro). Desafortunadamente, perderá cualquier confirmación no apurada y cambios escondidos, sin embargo, su copia de trabajo debe permanecer intacta.
Primero haga una copia de seguridad de sus archivos locales. Luego haga esto desde la raíz de su árbol de trabajo:
Luego, confirme los archivos modificados según sea necesario.
fuente
master
con el nombre de su rama.working
cuando se corrompió y estos pasos no me dieron una copia local de ninguna rama que no sea la maestra (y sí, intenté reemplazar la maestra anteriorworking
pero eso no funcionó). Terminé haciendo los pasos anteriores conmaster
, luego escondiendo mis cambios y haciendocheckout -b working origin/working
y sacando el alijo allí. Parece haber funcionado, ¡gracias!git status
cedieronfatal: Not a git repository: submodules/my-sub/../../.git/modules/my-sub
. Eliminar el submódulo del sistema de archivos y reiniciar el proceso restableció la normalidad. Probablemente asegurarse de que no haya conjuntos de cambios sin empujar en los submódulos primero es una buena idea ...Trabajando en una VM, en mi computadora portátil, la batería se agotó, recibí este error;
Logré que el repositorio funcione nuevamente con solo 2 comandos y sin perder mi trabajo (archivos modificados / cambios no confirmados)
Después de eso ejecuté un
git status
, el repositorio estaba bien y había mis cambios (esperando ser confirmado, hágalo ahora ...).git versión 1.9.1
Recuerde hacer una copia de seguridad de todos los cambios que recuerde, en caso de que esta solución no funcione y se necesite un enfoque más radical.
fuente
find .git/objects/ -size 0 -exec rm -f {} \;
funciona para mí;)git symbolic-ref HEAD refs/heads/master.
después de eliminar los objetos vacíos.Mi computadora se bloqueó mientras escribía un mensaje de confirmación. Después de reiniciar, el árbol de trabajo estaba como lo había dejado y pude confirmar con éxito mis cambios.
Sin embargo, cuando traté de correr
git status
conseguíA diferencia de la mayoría de las otras respuestas, no estaba tratando de recuperar ningún dato . Solo necesitaba que Git dejara de quejarse del archivo de objeto vacío.
Visión general
El "archivo objeto" es la representación hash de git de un archivo real que le interesa. Git piensa que debería tener una versión hash
some/file.whatever
almacenada.git/object/xx/12345
, y corregir el error resultó ser principalmente una cuestión de averiguar qué archivo se suponía que representaba el "objeto suelto".Detalles
Las posibles opciones parecían ser
Enfoque 1: eliminar el archivo objeto
Lo primero que intenté fue mover el archivo objeto
Eso no funcionó: Git comenzó a quejarse de un enlace roto. En el enfoque 2.
Enfoque 2: arreglar el archivo
Linus Torvalds tiene una excelente descripción de cómo recuperar un archivo de objeto que resolvió el problema para mí. Los pasos clave se resumen aquí.
Esto le dice de qué archivo se supone que el objeto vacío es un hash. Ahora puedes repararlo.
Después de hacer esto, lo comprobé
.git/objects/xx/12345
, ya no estaba vacío, y git dejó de quejarse.fuente
Tratar
Esto funcionó para mí. Guarda todo lo que no ha cometido y que solucionó el problema.
fuente
git stash
... fatal: no se puede crear '/ home / <usuario> /.git/index.lock': error de entrada / salidatouch .git/a
táctil: no se puede tocar '.git / a': error de entrada / salidasudo touch /home/guest/.git/a
NO ERRORgit stash
No los cambios locales para ahorrargit status
... nada de cometer, el directorio de trabajo limpiaUna recolección de basura solucionó mi problema:
Tarda un tiempo en completarse, pero se corrigió cada objeto suelto y / o índice dañado.
fuente
simplemente ejecutando un
git prune
problema solucionado para mífuente
git pull
tarda un poco más de lo habitual, supongo porque está reemplazando algunos objetos eliminados o algo así.Acabo de experimentar esto: mi máquina se bloqueó al escribir en el repositorio de Git, y se corrompió. Lo arreglé de la siguiente manera.
Comencé mirando cuántas confirmaciones no había enviado al repositorio remoto, por lo tanto:
Si no utiliza esta herramienta, es muy útil, por lo que sé, está disponible en todos los sistemas operativos. Esto indicaba que a mi control remoto le faltaban dos confirmaciones. Por lo tanto, hice clic en la etiqueta que indica la última confirmación remota (por lo general, esto será
/remotes/origin/master
) para obtener el hash (el hash tiene 40 caracteres de largo, pero por brevedad estoy usando 10 aquí, esto generalmente funciona de todos modos).Aquí está:
Luego hago clic en el siguiente commit (es decir, el primero que el control remoto no tiene) y obtengo el hash allí:
Luego uso ambos para hacer un parche para esta confirmación:
Luego hice lo mismo con el otro commit faltante, es decir, usé el hash del commit antes y el hash del commit en sí:
Luego me mudé a un nuevo directorio, cloné el repositorio desde el control remoto:
Luego moví los archivos de parche a la nueva carpeta, los apliqué y los confirmé con sus mensajes de confirmación exactos (se pueden pegar desde
git log
o desde lagitk
ventana):Esto restauró las cosas para mí (y tenga en cuenta que probablemente haya una forma más rápida de hacerlo para una gran cantidad de confirmaciones). Sin embargo, estaba ansioso por ver si el árbol en el repositorio corrupto puede repararse, y la respuesta es que sí. Con un repositorio reparado disponible como el anterior, ejecute este comando en la carpeta rota:
Obtendrás algo como esto:
Para hacer la reparación, haría esto en la carpeta rota:
es decir, elimine el archivo dañado y reemplácelo por uno bueno. Tu debes hacer esto varias veces. Finalmente habrá un punto donde puedes correr
fsck
sin errores. Probablemente tendrá líneas de "compromiso pendiente" y "blob colgante" en el informe, estas son una consecuencia de sus rebases y enmiendas en esta carpeta, y están bien. El recolector de basura los eliminará a su debido tiempo.Por lo tanto (al menos en mi caso) un árbol dañado no significa que se pierdan las confirmaciones no apresuradas.
fuente
También recibí un error de objeto suelto corrupto.
Lo arreglé con éxito yendo al directorio del objeto corrupto. Vi que los usuarios asignados a ese objeto no eran los usuarios de mi git. No sé cómo sucedió, pero ejecuté un
chown git:git
archivo en ese archivo y luego funcionó nuevamente.Esto puede ser una solución potencial para los problemas de algunas personas, pero no necesariamente todos.
fuente
Recibí este error después de que mi máquina (Windows) decidió reiniciarse. Afortunadamente, mi repositorio remoto estaba actualizado, así que hice un nuevo git-clone ...
fuente
Runnning
git stash; git stash pop
solucionó mi problemafuente
Seguí muchos de los otros pasos aquí; La descripción de Linus de cómo mirar el árbol / objetos git y encontrar lo que falta fue especialmente útil. git-git recupera la burbuja corrupta
Pero al final, para mí, tuve objetos de árbol sueltos / corruptos causados por una falla parcial del disco, y los objetos de árbol no son tan fáciles de recuperar / no cubiertos por ese documento.
Al final, eliminé el conflicto
objects/<ha>/<hash>
y lo uségit unpack-objects
con un archivo de paquete de un clon razonablemente actualizado. Pudo restaurar los objetos del árbol que faltaban.Todavía me dejó con muchos blobs colgantes, lo que puede ser un efecto secundario de desempacar cosas previamente archivadas, y abordado en otras preguntas aquí
fuente
En respuesta a @ user1055643 falta el último paso:
fuente
.git
y copia del proyecto clonado, el repositorio funcionará, pero no se conservarán sucursales locales ni escondites.Acabamos de tener el caso aquí. Sucedió que el problema era que la propiedad del archivo dañado era root en lugar de nuestro usuario normal. Esto fue causado por una confirmación realizada en el servidor después de que alguien haya realizado un "sudo su -".
Primero, identifique su archivo corrupto con:
Debería recibir una respuesta como esta:
Vaya a la carpeta donde está el archivo corrupto y haga un:
Verifique la propiedad del archivo corrupto. Si eso es diferente, simplemente regrese a la raíz de su repositorio y haga un:
¡Espero eso ayude!
fuente
Para mí esto ocurrió debido a un fallo de alimentación mientras se hace una
git push
.Los mensajes se veían así:
Intenté cosas como
git fsck
pero eso no ayudó. Dado que el bloqueo ocurrió durante ungit push
, obviamente sucedió durante la reescritura en el lado del cliente que ocurre después de que se actualiza el servidor. Miré a mi alrededor y pensé quec2388
en mi caso era un objeto de confirmación, porque se hacía referencia a él mediante entradas en.git/refs
. Entonces supe que podría encontrarloc2388
cuando mire el historial (a través de una interfaz web o un segundo clon).En el segundo clon hice un
git log -n 2 c2388
para identificar al predecesorc2388
. Luego lo modifiqué manualmente.git/refs/heads/master
y.git/refs/remotes/origin/master
para ser el predecesor enc2388
lugar dec2388
. Entonces podría hacer ungit fetch
. Elgit fetch
fallaron un par de veces para los conflictos en los objetos vacíos. Eliminé cada uno de estos objetos vacíos hasta que tuvegit fetch
éxito. Eso ha curado el repositorio.fuente
Resolví de esta manera: decidí simplemente copiar el archivo de objeto no dañado del clon de la copia de seguridad a mi repositorio original. Esto funcionó igual de bien. (Por cierto: si no puede encontrar el objeto en .git / objects / por su nombre, probablemente haya sido [empaquetado] [paquete] para ahorrar espacio).
fuente
Tuve este mismo problema en mi repositorio de git remoto. Después de mucha solución de problemas, descubrí que uno de mis compañeros de trabajo había realizado una confirmación en la que algunos archivos en .git / objects tenían permisos de 440 (r - r -----) en lugar de 444 (r - r - r -). Después de pedirle al compañero de trabajo que cambiara los permisos con "objetos chmod 444 -R" dentro del repositorio de git, el problema se solucionó.
fuente
Acabo de tener un problema como este. Mi problema particular fue causado por un bloqueo del sistema que corrompió la confirmación más reciente (y, por lo tanto, también la rama maestra). No había presionado, y quería volver a hacer ese compromiso. En mi caso particular, pude tratarlo así:
.git/
:rsync -a .git/ git-bak/
.git/logs/HEAD
y encuentre la última línea con una ID de confirmación válida. Para mí, esta fue la segunda confirmación más reciente. Esto fue bueno, porque todavía tenía las versiones de directorio de trabajo del archivo, y por lo tanto todas las versiones que quería.git branch temp <commit-id>
git reset master temp
para mover la rama maestra a la nueva confirmación que realizó en el paso 2.git checkout master
y compruebe que se ve bien congit log
.git branch -d temp
.git fsck --full
, y ahora debería ser seguro eliminar cualquier objeto dañado que fsck encuentre.Eso funcionó para mí. Sospecho que este es un escenario razonablemente común, ya que el commit más reciente es el más probable que se corrompa, pero si pierde uno más atrás, es probable que aún pueda usar un método como este, con un uso cuidadoso
git cherrypick
y el registro en.git/logs/HEAD
.fuente
Cuando tuve este problema, hice una copia de seguridad de mis cambios recientes (ya que sabía lo que había cambiado) y luego eliminé el archivo del que se quejaba en .git / location. Entonces hice un git pull. Sin embargo, tenga cuidado, esto podría no funcionar para usted.
fuente
Encontré esto una vez que mi sistema se bloqueó. Lo que hice es esto:
(Tenga en cuenta que sus confirmaciones corruptas se pierden, pero los cambios se retienen. Es posible que tenga que volver a crear esas confirmaciones al final de este procedimiento)
.git
carpeta..git
carpeta en él.fuente
Simplemente elimine la carpeta .git y agréguela nuevamente. Esta solución simple funcionó para mí.
fuente
.git
y copia del proyecto clonado, el repositorio funcionará, pero no se conservarán sucursales locales ni escondites. Además, una sugerencia amigable, elimine su respuesta por completo para dejar de recibir votos negativos.