Git存储库损坏(错误的头部检查;松散的对象已损坏)

Git存储库损坏(错误的头部检查;松散的对象已损坏)

昨天晚上我写了一个提交信息时遇到电源故障。 当我启动机器备份,我无法完成提交。 我运行git reset ,添加了更改的文件,并再次尝试,得到这样:

% 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显示以下内容:

% 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

我注意到消息正在抱怨不同的对象。

我搜索了SO和Web,并尝试了一些不同的东西,但没有效果。

  • 我没有最近的备份副本。
  • 将存储库克隆到另一个目录没有帮助; 新的存储库显示完全相同的问题。
  • git stash给出与git commit相同的消息。 所有其他git命令似乎正常工作。

我怎么知道是什么问题并解决?

编辑: git log输出建议(只是前几行):

% 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

这是一个小的个人项目; 我通常只是在(主人)工作,但我正在做一个实验(new_tokenize)。 电源故障前最后一次成功完成了253b086。

采纳答案:

看来,git在.git / objects中为新提交创建了文件,但没有成功写入它们。 我解决了它,一次删除它们,并重新运行git fsck --full来找到下一个。 我从最初由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

等等。 在git fsck清理之前,我删除了五个对象,对应(我想)对我提出的提交中的五个文件。 我想文件历史没有被破坏。

顺便说一句,我想到了另外一种似乎也是有效的方法。 git clone复制坏对象,但git push不会。 备份之后,我创建了一个新的空库(--bare,因为否则你不能推送到master),然后将我的更改分解并将两个分支推入新的存储库。 那么这只是一个重新检查并恢复我的备份的最新变化的问题。

如果有人关心这里的失败机制,仍然感兴趣。 感谢jkyako的帮助。

参考更多解答:Git存储库损坏(错误的头部检查;松散的对象已损坏),转载请保留Git存储库损坏(错误的头部检查;松散的对象已损坏)

更多:corrupt