【发布时间】:2014-07-06 17:10:25
【问题描述】:
昨天晚上我在写提交消息时遇到了电源故障。当我重新启动机器时,我无法完成提交。我跑了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
我注意到消息在抱怨不同的对象。
我搜索了 StackOverflow 和 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
这是一个小型的个人项目;我通常只是在 (master) 工作,但当时我正在做一个实验 (new_tokenize)。 253b086 是断电前最后一次成功的提交。
【问题讨论】:
-
也许可以试试
git log或git log --oneline --decorate --all看看历史是什么样子的 -
完成。不确定您到底在寻找什么,如果您想要完整的输出或什么,请告诉我。我没有做任何花哨的事情
-
鉴于报告的损坏对象,主要是想弄清楚最终丢失/无法访问的内容。假设您在其他地方保存了任何未提交的本地更改,您可以
git checkout日志中列出的每个 id 吗?让我想知道是否暴力解决方案是在每个 id 上编写脚本,签出 id,将工作树复制到其他地方(可能是一个新的 git 存储库)以尝试重建一个非损坏的存储库。 -
刚刚阅读了this post 并认为将损坏的对象临时移动到另一个位置并重试
git fsck --full以找出当前引用有问题的对象可能会很有趣。 -
感谢@jkyako,这让我走上了正轨。答案即将到来。