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 quegit 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