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

如何处理损坏的Git对象文件?,git,Git,我在接近配额时做了一次Git拉取,结果(我想是这样)得到了一个损坏的文件: $ git pull walk dffbfa18916a9db95ef8fafc6d7d769c29a445aa fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted $ git fsck --full bad sha1 file: .git/objects/66/b55c76947b1d38983e0944f1e6388c86f07a1

我在接近配额时做了一次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为零字节;删除它并没有解决我的问题(同样的错误)。

是正式答案


最简单的答案是:找到未损坏的对象并复制它们。

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

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

此时,新的
git拉取应该会成功

…假设它首先会成功。在这种情况下,一些本地修改似乎阻止了尝试合并,因此
隐藏
隐藏弹出
。不过,这可能发生在任何合并中,与损坏的对象无关。(除非有必要进行索引清理,并且在这个过程中隐藏了索引…但我不这么认为。)

您可以使用“查找”命令删除
/objects
目录中大小为0的所有文件,命令如下:

find .git/objects/ -size 0 -delete

建议备份。

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


我通过在另一个位置再次克隆回购协议解决了这个问题。然后,我将整个src-dir(显然没有.git-dir)从损坏的repo复制到新克隆的repo中。因此,我拥有了所有最新的更改和一个干净、可用的存储库。

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

rm -rf .git
git remote set-url origin <repo-url>
rm-rf.git
git远程设置url源

内容必须与文件名相加。没有办法根据散列恢复内容,因此,除非git为这种情况内置了某种冗余(我不能说它没有),否则我会说你需要重新获取或克隆远程设备。你说你删除了它-之后你又尝试过拉吗?零大小的临时对象有中止传输的味道,
find的输出-名称D4A0E7599494BEE2B5351113895B43C351496B3
什么都不是。删除sha1文件然后拉取只会导致生成空的sha1文件。另外,
$git cat file-t D4a0e7599494bFee2b535113895b43c1496b3的
输出是:
错误:找不到D4a0e7599494bFee2b535113895b43c149b3致命:git cat文件D4a0e7599494bFee2bfee2b535113895b43c35149b3:坏文件
对象将被存储。它应该是
.git/objects/d4/a0e7599…
。您可以尝试备份并删除该对象(以及删除任何关联的临时文件),然后再次拖动。这并没有特别大的帮助。所涉及的腐败对象几乎肯定不是需要追回的对象;它是一个部分从远程获取的。嗯,这很有帮助,在挂起之后,我有两个对象是空的,移除它们可以让我从远程repo获取真实的对象。幸运的是,我在暂停前推了一下。但为了了解我还没有提交的文件的情况,希望它们在挂起之前已经同步到磁盘。警告,如果需要进一步检查,最好保存删除的哈希。这可能会导致
错误:refs/heads/branch未指向有效对象。确保备份。