昨天晚上我在写提交消息时遇到了电源故障。当我重新启动机器时,我无法完成提交。我跑了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
我注意到这些消息抱怨不同的对象。
我搜索了 Stack Overflow 和网络,并尝试了一些不同的方法,但没有成功。
- 我没有最近的备份副本。
- 将存储库克隆到另一个目录没有帮助;新的存储库也出现了完全相同的问题。
-
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 在 .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),然后取消暂存我的更改并将两个分支推送到新存储库中。然后只需再次检查并从备份中恢复最新更改即可。
如果有人愿意阐明这里的故障机制,仍然感兴趣。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)