根据您提供的链接,您需要从另一个来源获取损坏的数据(例如,首先在本地克隆存储库并从那里获取数据)。
但是现在(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日)
协助者: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()
将修复整个类别的错误。)