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

Mik*_*ike 52 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
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这种腐败?

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

Cas*_*bel 36

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

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

在这一点上,一个新鲜的git pull应该成功.

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

  • 这可能会导致“错误:refs/heads/branch 未指向有效对象!”。确保备份。 (2认同)

小智 24

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

find .git/objects/ -size 0 -delete
Run Code Online (Sandbox Code Playgroud)

建议备份.


Fro*_*sty 8

从存储库腐败中恢复是官方的答案.

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

  • 这不是特别有用.有问题的腐败对象几乎肯定不是需要恢复的对象; 它是从遥控器中部分取出的一个. (2认同)

小智 6

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

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


Al *_*han 5

简单的解决方案:

  1. 删除.git文件夹
  2. 从 github 克隆您的项目git clone url
  • (克隆到工作文件夹之外,您只需要.git文件夹)
  1. .git文件夹剪切并粘贴到您的工作文件夹中
  2. 现在你可以添加 git commit
git add .
git commit -m 'update-project'
git push
Run Code Online (Sandbox Code Playgroud)

  • 还应该提到,我刚刚做了一个“git status”并刷新了所有索引,所以不必添加/提交/推送。 (3认同)
  • 正如@YiminRong 所说,只需在粘贴新的“.git”文件夹后执行“git status”即可。感谢您的解决方案 (2认同)