Git:损坏的松散对象

5

我想将我的master分支与另一个名为pull-stage的分支合并,但 Git 报错:

error: inflate: data stream error (invalid distance too far back)
error: corrupt loose object '5a63450f4a0b72abbc1221ccb7d9f9bfef333250'
fatal: loose object 5a63450f4a0b72abbc1221ccb7d9f9bfef333250 (stored in .git/objects/5a/63450f4a0b72abbc1221ccb7d9f9bfef333250) is corrupt

我该如何解决这个问题?

我已经查看了其他帖子,但没有成功的结果:


1
可能是Git:“损坏的松散对象”的重复问题。 - CharlesB
如果您已经查看了这些帖子,那么您就知道没有其他解决方案可以从拥有对象的另一个克隆中获取它,请参阅链接的帖子以获取详细信息。 - CharlesB
2个回答

1
我最近也遇到了同样的错误,在运行git的virtualbox guest崩溃后。我进行了以下操作,解决了我的特定问题。在尝试此操作之前,请备份您的代码库。
  1. 删除松散对象 rm .git/object/5a/63450f4a0b72abbc1221ccb7d9f9bfef333250

  2. 编辑logs/refs/head/,找到倒数第二个提交ID。

  3. 编辑refs/head/,使用旧的提交ID。

这样应该可以让您回到标准的git操作(但是最后一次提交将会丢失)。

0

根据您提供的链接,您需要从另一个来源获取损坏的数据(例如,首先在本地克隆存储库并从那里获取数据)。

但是现在(Git 2.40,2023年第一季度),需要获取的内容更加精确:

使用Git 2.40(2023年第一季度),即使在具有promisor remote的存储库中,尝试惰性获取预期为提交的对象也是无用的,因为没有“过滤器”模式省略提交对象。
利用这种假设,在错误发生时快速失败。

请查看提交 7e2ad1c, 提交 9e59b38, 提交 ae285ac, 提交 acd6f0d (2022年12月14日) 由Jonathan Tan (jhowtan)提交。
(由Junio C Hamano -- gitster --合并于提交 1f9b02b, 2023年1月5日)

object-file:检测到时发出损坏错误

协助者:Jeff King
签署者:Jonathan Tan

不要依赖于errno在函数调用之间的保留,而是教导do_oid_object_info_extended()在首次检测到对象损坏时自行报告。
检测到3种类型的损坏:
  • 替换对象丢失
  • 松散对象损坏
  • 压缩对象损坏且无法以其他方式读取该对象

请注意,在此补丁的差异的RHS中,3ba7a06(“如果由于EMFILE而无法读取松散对象,则松散对象不会损坏”,2010-10-28,Git v1.7.4-rc0 - merge)引入了对ENOENT的检查也被删除。
此检查的目的是避免在errno包含类似EMFILE(或任何非ENOENT的内容)的情况下误报损坏,此时将呈现更通用的报告。
因为从这个补丁开始,我们不再依赖这样的启发式方法来确定损坏,而是在我们读取未预期的内容时在该点上显示错误消息,所以这个检查不再必要。

除了更具弹性外,这还为将来的补丁做好了准备,其中do_oid_object_info_extended()的间接调用者将需要这样的功能。

所以你会得到:

  • 无法打开松散的对象 <sha1>
  • 松散的对象 <sha1> (存储在 </path/to/object>) 已损坏
  • 未找到 <sha1> 的替换 <sha1>
  • 打包的对象 <sha1> (存储在 <pack_name>) 已损坏

因此:

提交: 不要懒惰地获取提交

已签署:Jonathan Tan

在解析提交时,如果提交丢失或损坏,则立即失败,而不是尝试获取它们。这是通过内联repo_read_object_file()并设置防止获取的标志来完成的。
这是由于通过错误(不一定是通过Git)导致部分克隆的对象存储中存在损坏的情况。在这种特殊情况下,问题在于当“{{link1:git gc}}”man尝试过期引用日志时,会调用repo_parse_commit(),从而触发获取缺失提交的操作。
(解决此问题的其他可能方法包括从“git gc”传递参数到{{link3:git reflog}}man以抑制所有惰性获取,但我认为这个修复程序处于错误的级别 - 修复“git reflog”意味着这个特定命令可以正常工作,或者我们认为是这样(如果它需要读取一个合法丢失的blob,例如.gitmodules文件,则会失败),但修复repo_parse_commit()将修复整个类别的错误。)

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