ver tag repositorio modificados crear archivos actualizar git corrupt

tag - El repositorio de Git está corrupto(comprobación incorrecta del encabezado, el objeto perdido está dañado)



git rename tag (3)

Como se describe en esta respuesta ejecuté:

git reflog expire --expire-unreachable=now --all git gc --prune=now

Que eliminó todos mis blobs colgantes y confirmaciones colgantes, así como los objetos db corruptos.

¡Era mucho más rápido que rastrearlos uno a uno!

Experimenté un corte de energía ayer por la tarde mientras escribía un mensaje de compromiso. Cuando reinicié la máquina, no pude completar la confirmación. git reset , agregué los archivos modificados e intenté de nuevo, y obtuve esto:

% git commit error: inflate: data stream error (incorrect header check) error: unable to unpack a94406345ac44982b00cf57b4b9660a35436637f header fatal: a94406345ac44982b00cf57b4b9660a35436637f is not a valid object

git fsck revela lo siguiente:

% git fsck --full Checking object directories: 100% (256/256), done. error: inflate: data stream error (incorrect header check) error: unable to unpack 4346883490a0990e68db0187241abc1642765a73 header error: inflate: data stream error (incorrect header check) fatal: loose object 4346883490a0990e68db0187241abc1642765a73 (stored in .git/objects/43/46883490a0990e68db0187241abc1642765a73) is corrupt

Noto que los mensajes se quejan de diferentes objetos.

Busqué SO y la Web e intenté algunas cosas diferentes pero fue en vano.

  • No tengo una copia de seguridad reciente.
  • Clonar el repositorio en otro directorio no ayuda; el nuevo repositorio muestra exactamente los mismos problemas.
  • git stash da el mismo mensaje que git commit . Todos los otros comandos de git parecen funcionar normalmente.

¿Cómo puedo saber qué es lo que está mal y arreglarlo?

Editar: git log output como se sugiere (solo las primeras líneas):

% git log --oneline --decorate --all |head -n 8 253b086 (HEAD, new_tokenize) Normalized tokenizer interface slightly 0f2425a (master) Added procs to eval layer a4d4c22 Added procedures as a type d1e15ad (tag: v0.10) Added `if'' form with tail call semantics f94a992 (tag: v0.9) Completed environments 031116e Fixed bug where # on a line by itself caused segfault 3d8b09f Added environments, define and set! 01cc624 Put symbol table implementation into types.c

Este es un pequeño proyecto personal; Normalmente solo trabajo en (maestro) pero estaba haciendo un experimento en ese momento (new_tokenize). 253b086 fue la última confirmación exitosa antes de la falla de energía.


Parece que git creó archivos en .git / objects para la nueva confirmación, pero no los escribió correctamente. Lo solucioné eliminándolos uno a la vez y volviendo a ejecutar git fsck --full para encontrar el siguiente. Empecé con el reportado originalmente por git fsck :

% rm -f .git/objects/43/46883490a0990e68db0187241abc1642765a73 % git fsck --full Checking object directories: 100% (256/256), done. error: inflate: data stream error (incorrect header check) error: unable to unpack 86e7247af5865e857a3b61eed99986e2d9538df1 header error: inflate: data stream error (incorrect header check) fatal: loose object 86e7247af5865e857a3b61eed99986e2d9538df1 (stored in .git/objects/86/e7247af5865e857a3b61eed99986e2d9538df1) is corrupt % rm -f .git/objects/86/e7247af5865e857a3b61eed99986e2d9538df1 % git fsck --full Checking object directories: 100% (256/256), done. error: inflate: data stream error (incorrect header check) error: unable to unpack a94406345ac44982b00cf57b4b9660a35436637f header error: inflate: data stream error (incorrect header check) fatal: loose object a94406345ac44982b00cf57b4b9660a35436637f (stored in .git/objects/a9/4406345ac44982b00cf57b4b9660a35436637f) is corrupt

Y así. Borré cinco objetos antes de que git fsck apareciera limpio, lo que corresponde (como supongo) a los cinco archivos en la confirmación que estaba tratando de hacer. Supongo que el historial del archivo no estaba dañado en absoluto.

Por cierto, pensé en otro método que parece funcionar también. git clone copia los objetos malos, pero git push no. Después de realizar la copia de seguridad, creé un nuevo repositorio vacío (--bare, porque de lo contrario no puedo presionar para dominar), luego desglosé mis cambios y empujé ambas ramas al nuevo repositorio. Entonces solo era cuestión de verificarlo nuevamente y restaurar los últimos cambios de mis copias de seguridad.

Todavía estoy interesado si alguien quiere arrojar luz sobre el mecanismo de falla aquí.


Respuesta simple a esta pregunta para cualquier persona que enfrenta este problema: el comando git clone es la solución, si tiene un repositorio remoto clonelo en la carpeta local (después de eliminar el repositorio local dañado), en caso de que no tenga repositorio remoto, intente empujar el repositorio corrupto a github y luego clonarlo desde allí, creo que los objetos corruptos no se presionarán y solucionará el problema