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个回答

1

我之前也遇到过同样的问题。我通过从.git/objects目录中删除对象文件来解决它。

针对下面的错误:

$ 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

解决方案:

  1. 进入您的顶级目录并取消隐藏 .git 文件夹
  • 在 Windows 上,您可以通过在 cmd 中运行此命令来完成:attrib +s +h .git
  1. 然后进入 .git/objects 文件夹

  2. 如上面的错误消息所述(存储在 .git/objects/45/ba4ceb93bc812ef20a6630bb27e9e0b33a012a),该对象已损坏,您可以看到该对象位于名为"45"的目录中。因此,请进入目录 .git/objects/45/

  3. 最后找到名为 ba4ceb93bc812ef20a6630bb27e9e0b33a012a 的对象并将其删除。

现在,您可以继续使用 git statusgit add . 检查更改并进行操作。


0
我之前也遇到过这样的问题。我的问题是由于系统崩溃导致最近的提交(因此也包括主分支)被损坏了。我还没有推送,想要重新制作那个提交。在我的情况下,我能够像这样处理它:
  1. 备份 .git/ 文件夹: rsync -a .git/ git-bak/
  2. 检查 .git/logs/HEAD,找到最后一行带有有效提交 ID 的记录。对我来说,这是第二个最近的提交。这很好,因为我仍然拥有文件的工作目录版本,所以我想要的每个版本都在。
  3. 在该提交处创建一个分支:git branch temp <commit-id>
  4. 使用工作目录中的文件重新提交破损的提交。
  5. git reset master temp 将主分支移动到步骤 2 中创建的新提交。
  6. git checkout master 并使用 git log 检查是否正确。
  7. git branch -d temp
  8. git fsck --full,现在可以安全地删除 fsck 找到的任何损坏的对象。
  9. 如果一切正常,请尝试推送。如果成功,

这对我很有用。我怀疑这是一个相当常见的情况,因为最近的提交最有可能被损坏,但如果你失去了更早的提交,你可能仍然可以使用像这样的方法,通过谨慎地使用git cherrypick.git/logs/HEAD中的reflog。


0

我在我的裸远程 git 仓库中遇到了同样的问题。经过多次排查,我发现我的其中一位同事提交了一个 commit,其中 .git/objects 中的某些文件权限为 440(r--r-----),而不是 444(r--r--r--)。在要求同事在裸 git 仓库内使用“chmod 444 -R objects”更改权限后,问题得以解决。


0

这个问题通常发生在同一个git checkout上使用不同版本的git客户端时。例如:

  • 命令行
  • IDE内置git
  • 在docker / vm容器内部
  • GIT图形界面工具

请确保使用创建提交的相同客户端进行推送。


0

我在Windows 10电脑上遇到了类似的问题,OneDrive备份我的文档文件夹,其中包含我的git存储库。

查看git对象目录中的对象时,我没有看到绿色的勾号,但是该文件有蓝色的同步图标。所有其他对象文件似乎都有绿色的勾号。尝试各种方法后,我尝试选择“始终将此文件夹保留在此设备上”,但出现错误:错误0x80071129,重解析点缓冲区中存在的标记无效。

这个链接(https://answers.microsoft.com/en-us/msoffice/forum/all/error-0x80071129-the-tag-present-in-the-reparse/b8011cee-98c5-4c33-ba99-d0eec7c535a0)建议以管理员身份运行chkdsk /r /f来修复此问题(必须重新启动计算机)。我这样做了,它解决了我的问题。


0

我没有丢失其他未推送的分支的方法: 破损对象的引用应该在refs/heads/<current_branch>中。如果你进入.git\logs\refs\heads\<current_branch>,你会发现最后一次提交有完全相同的值。我把上一个提交的那个值复制到了第一个文件里,问题就解决了。


0

我的(Windows)电脑自动重启后出现了这个错误。

幸运的是,我的远程代码仓库是最新的,所以我只需进行一次全新的 Git 克隆...


0

当我遇到这个问题时,我备份了最近的更改(因为我知道我改了什么),然后在.git/location中删除了它抱怨的文件。然后我进行了git pull操作。不过要小心,这可能对你不起作用。


0
我解决这个问题的方法是在文件夹中找到.git文件,然后尝试重新提交GitHub上的所有内容。因为我对本地计算机上的内容满意,所以可以将旧的.git文件删除。但是,最好将其备份到其他地方,因为正如有人提到的那样,它可能会引起副作用,请先尝试其他方法。但是这种方法对我有效。
git remote add <name of repo such as main> <URL>
git commit -m"First commit."
git push --set-upstream <name of repo such as main> <name of repo such as main>

1
欢迎来到stackoverflow!虽然向现有问题添加新解决方案很棒,但是这个建议(删除本地.git文件夹并使用备份)已经被多次提出,并在其他答案中进行了更详细的解释。 - ChrisB
@ChrisB,抱歉。我在寻找解决方案时已经修复了它;然而,当我从最佳解决方案中读到问题是一个本地的.git文件时,我意识到我以前遇到过类似的问题,所以我按照我知道的方法进行了修复。不幸的是,我没有阅读其他评论,所以我没有意识到其他人建议与我的解决方案相同,因此我道歉。 - Emmanuel Kofy Agyapong

0

我曾经遇到过完全相同的错误,但是成功地将我的存储库恢复了而没有丢失任何更改。

我不知道这个方法是否适用于其他人,因为损坏原因可能有多种,但值得一试。

我:

  • 为受损的git存储库制作了几个备份以防万一
  • 从远程存储库克隆了最新推送的版本
  • 复制了所有与HEAD、FETCH_HEAD、ORG_HEAD等相关的文件无关的受损.git文件夹中的文件...最重要的是refs、obj和index
  • 最终获得了一个有效的历史记录,但索引已损坏,应用了此帖子如何解决使用Git时出现“错误:坏索引-致命:索引文件损坏”中的解决方案

然后我的存储库就恢复正常了...

为了确保我没有推送任何错误,我再次从远程克隆,从恢复的存储库中检出我想要保存的更改,并进行了新的提交。


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