Git: “损坏的松散对象”

508
每当我从远程拉取时,都会出现关于压缩的以下错误。当我运行手动压缩时,也会出现相同的错误。
$ git gc
error: Could not read 3813783126d41a3200b35b6681357c213352ab31
fatal: bad tree object 3813783126d41a3200b35b6681357c213352ab31
error: failed to run repack

我需要知道,关于这个问题应该怎么处理?

从cat-file命令中,我得到了以下内容:

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

我从 git fsck 中得到了以下信息(不确定是否与此相关):

$ git fsck
error: inflate: data stream error (invalid distance too far back)
error: corrupt loose object '45ba4ceb93bc812ef20a6630bb27e9e0b33a012a'
fatal: loose object 45ba4ceb93bc812ef20a6630bb27e9e0b33a012a (stored in .git/objects/45/ba4ceb93bc812ef20a6630bb27e9e0b33a012a) is corrupted

有人能帮我解密这个吗?


5
谢谢...但是如何"看"一个对象呢?我对Git还很新 :) - asgerhallas
2
“git show” 给我的信息和 “git fsck” 已经给的一样,很遗憾没有更多的信息。 - asgerhallas
6
Linus Torvalds写了一份有关此错误的有用文档,以及如何手动重建blob对象的方法(如果您拥有文件):如何恢复损坏的blob对象 一些技巧来重建blob对象以修复损坏的存储库 - Uwe Kleine-König
2
你能否添加一些注释或编辑已接受的答案?我处于完全相同的情况下,已接受的答案似乎没有足够的细节来“Just Work TM”,而是会迫使我自己深入了解细节。 - ripper234
相关链接:https://dev59.com/PnRA5IYBdhLWcg3w2x2W - Vadzim
显示剩余3条评论
34个回答

0
在我的情况下,问题是我的终端/笔记本在检出分支的过程中崩溃了,导致该分支出现了一些损坏。我无法在该分支上使用git log/status/branch等命令。
这里的大多数其他答案建议删除.git目录并从远程重新克隆repo,但这是一种非常破坏性的操作。在执行此操作之前,请尝试将有问题的分支重置为您的master/main/whatever分支(或者,如果master/main/etc.是您的受损分支,则尝试将其重置为某个其他引用,其名称您记得):
git reset --hard master

或者尝试只检出该分支。

这使我摆脱了损坏的分支状态,让我可以查看我的日志/存储/分支/状态等。尽管我失去了该分支上的所有提交记录,但这比丢失所有分支上的所有工作并不得不重新克隆仓库要好得多。


0

创建备份并将仓库克隆到一个新目录中

cp -R foo foo-backup
git clone git@url:foo foo-new

(可选)如果您正在使用的分支与主分支不同,请切换到该分支。

cd foo-new
git checkout -b branch-name origin/branch-name

同步更改,但不包括.git目录

rsync -aP --exclude=.git foo-backup/ foo-new

-1

你不需要克隆,也不需要丢失未提交的更改。只需使用 git rm -rf .git/ 删除 .git 文件夹,然后通过启动新仓库、设置远程和重置 HEAD 来恢复 git 文件夹。我已经在这里添加了恢复被删除 git 文件夹的说明:

https://dev59.com/tG025IYBdhLWcg3wCxVN#67610397


-8

只需删除 .git 文件夹并重新添加即可。这个简单的解决方案对我很有效。


3
这将会清空你的本地代码库,可能会产生一些不期望的副作用 :) 请修改你的提案并添加这个警告。 - Felix
1
如果您删除了.git文件夹,并从克隆的项目中复制,仓库将可以正常工作,但是本地分支和存储都不会被保留。另外,友情建议,完全删除您的回答以停止接收负评。 - Vladimir Vukanac
1
哇塞,这就像是用榴弹炮来夹眉毛一样。 - Tuncay Göncüoğlu
这基本上是与 https://dev59.com/5G855IYBdhLWcg3wlVca#13918515 相同的答案,只是没有那么详细。 - JBoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接