Git 存储库已损坏(标头检查不正确;松散对象已损坏)

问题描述 投票:0回答:6

昨天晚上我在写提交消息时遇到了电源故障。当我重新启动机器时,我无法完成提交。我运行了

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 corrupt
6个回答
90
投票

看起来 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),然后取消暂存我的更改并将两个分支推送到新存储库中。然后只需再次检查并从备份中恢复最新更改即可。

如果有人愿意阐明这里的失败机制,我仍然感兴趣。


15
投票

这个答案中所述,我跑了:

git reflog expire --expire-unreachable=now --all
git gc --prune=now

这删除了我所有的悬空 blob 和悬空提交,以及损坏的数据库对象。

这比一一追踪要快多了!


11
投票

对于任何面临此问题的人来说,这个问题的简单答案: git clone 命令是修复方法,如果有远程存储库,则将其克隆到本地文件夹(删除损坏的本地存储库后),如果您没有远程存储库,则尝试将损坏的存储库推送到 github,然后从那里克隆它,我认为损坏的对象不会被推送,它将解决问题


0
投票

我落在同样的地方并用一种奇怪的方式固定, 在 Windows 上, 删除了

.git
文件夹, 在另一个文件夹上克隆相同的存储库 将
.git
文件夹从新文件夹复制到旧存储库 然后
git add .
git commit -m ...
git push ....


0
投票

这是我没有看到提及的答案,它是最适合我的情况的答案。就我而言,我怀疑 git 服务器实现行为不当。

fsck
单独获取后会立即发现错误,这让我认为我从服务器获取了错误的数据。

我从文件系统中删除了损坏的 git 对象(由

git fsck --full
列出):

> git fsck --full                                                                                                                                    
error: inflate: data stream error (incorrect data check)
error: corrupt loose object 'd701af6e8a35577e8c9443c70edc898fdfe06aab'
error: unable to unpack contents of .git/objects/d7/01af6e8a35577e8c9443c70edc898fdfe06aab
error: d701af6e8a35577e8c9443c70edc898fdfe06aab: object corrupt or missing: .git/objects/d7/01af6e8a35577e8c9443c70edc898fdfe06aab

然后我就跑了

git fetch --refetch

此选项不会与服务器协商以避免传输本地已存在的提交和关联对象,而是像新克隆一样获取所有对象。

由于不良数据似乎源自文件增量,因此重新获取能够避开此问题并以最小的努力修复我的存储库。


-1
投票

我遇到了同样的问题并解决了它。删除 .git 文件夹,然后运行 git init。 这将创建一个新的 git 文件夹并且它将起作用。

© www.soinside.com 2019 - 2024. All rights reserved.