如何处理损坏的Git对象文件?

时间:2010-11-06 03:20:29

标签: git

当我接近我的配额时,我做了一个Git拉,结果(所以我想),得到了一个损坏的文件:

$ git pull
walk dffbfa18916a9db95ef8fafc6d7d769c29a445aa
fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted

$ git fsck --full
bad sha1 file: .git/objects/66/b55c76947b1d38983e0944f1e6388c86f07a1b.temp
fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted

$ git cat-file -t d4a0e7599494bfee2b5351113895b43c351496b3
error: unable to find d4a0e7599494bfee2b5351113895b43c351496b3
fatal: git cat-file d4a0e7599494bfee2b5351113895b43c351496b3: bad file

如何解决这种腐败?

.git / objects / 66 / b55c76947b1d38983e0944f1e6388c86f07a1b.temp为零字节;删除它没有解决我的问题(相同的错误)。

5 个答案:

答案 0 :(得分:36)

通常,修复损坏的对象可能非常困难。但是,在这种情况下,我们确信问题是中止传输,这意味着对象位于远程存储库中,因此我们应该能够安全地删除我们的副本并让git从远程获取它,这次正确

显然可以删除临时对象文件,其大小为零。这对我们没有好处。引用它的腐败对象d4a0e75...是我们真正的问题。它可以在.git/objects/d4/a0e75...中找到。正如我上面所说,移除它是安全的,但为了以防万一,先备份它。

此时,新的git pull应该会成功。

......假设它首先会取得成功。在这种情况下,似乎某些本地修改阻止了尝试合并,因此stashpullstash pop是有序的。但是,任何合并都可能发生这种情况,并且与损坏的对象没有任何关系。 (除非有必要进行一些索引清理,并且存储在此过程中执行了...但我不相信。)

答案 1 :(得分:23)

您可以使用"查找"使用以下命令删除{0}大小的/objects文件夹中的所有文件:

find .git/objects/ -size 0 -delete

建议备份。

答案 2 :(得分:7)

Recovering from Repository Corruption是正式答案。

真正简短的回答是:找到未损坏的对象并复制它们。

答案 3 :(得分:0)

对于遇到相同问题的任何人:

我通过在另一个位置再次克隆仓库来解决了这个问题。然后,我将整个src目录(显然没有.git目录)从损坏的存储库复制到新克隆的存储库中。因此,我拥有了所有最近的更改以及一个干净且可以使用的存储库。

答案 4 :(得分:0)

唯一对我有用的是删除git repo并重新配置它:

rm -rf .git
git remote set-url origin <repo-url>