Repositorio Git corrupto (comprobación incorrecta del encabezado; el objeto suelto está dañado)


Experimenté un corte de energía ayer por la noche mientras escribía un mensaje de confirmación. Cuando reinicié la máquina no pude completar la confirmación. Corrí git reset, agregué los archivos cambiados, y lo 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é ASÍ y la Web y probé algunas cosas diferentes, pero en vano.

  • No tengo una copia de seguridad reciente copia.
  • 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 demás comandos de git parecen funcionar normalmente.

¿Cómo puedo decir lo que está mal y arreglarlo?

Editar: git log salida 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 (master) pero estaba haciendo un experimento en el tiempo (new_tokenize). 253b086 fue el último compromiso exitoso antes de la falla de energía.

 49
Author: trentcl, 2014-05-18

3 answers

Parece que git creó archivos en .git / objects para la nueva confirmación, pero no escribió correctamente en ellos. Lo resolví borrá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í sucesivamente. Borré cinco objetos antes de que git fsck saliera limpio, correspondiendo (como supongo) a los cinco archivos en la confirmación que estaba tratando de hacer. Supongo que el historial de archivos no estaba dañado en absoluto.

Incidentalmente, Pensé en otro método que parece funcionar también. git clone copia los objetos defectuosos, pero git push no lo hace. Después de hacer una copia de seguridad, creé un nuevo repositorio vacío (bare bare, porque de lo contrario no se puede enviar a master), luego desprotegí mis cambios y empujé ambas ramas al nuevo repositorio. Entonces solo era cuestión de comprobarlo de nuevo y restaurar los últimos cambios de mis copias de seguridad.

Todavía interesado si alguien se preocupa por arrojar luz sobre el mecanismo de falla aquí.

 57
Author: trentcl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-28 13:41:23

Respuesta simple a esta pregunta para cualquiera que se enfrente a este problema: el comando git clone es la solución, si tiene un repositorio remoto, clónelo 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 clónelo desde allí, creo que los objetos corruptos no se empujarán y solucionará el problema

 8
Author: TooCooL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-14 08:36:31

Como se describe en esta respuesta corrí:

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.

¡Fue mucho más rápido que rastrearlos uno por uno!

 4
Author: BitBot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-08 15:14:34