为何`git rev-list --objects`会遗漏两个Blob对象?
以下是可能导致你遇到该问题的核心原因:
命令参数顺序错误:你执行的
git rev-list --objects <my_rev_list> RevListOut.txt中,RevListOut.txt被Git当作待遍历的引用(提交ID、分支名等)处理,而非输出文件。正确写法应通过输出重定向指定文件:git rev-list --objects <my_rev_list> > RevListOut.txt若
RevListOut.txt不是有效Git引用,Git会忽略该参数,但这可能导致预期的遍历范围未被正确执行,进而遗漏对象。<my_rev_list>的格式或范围不完整:用
echo -e "<my_rev_list>"向git pack-objects传递rev范围时,若echo的输出格式(如换行、空格分隔)与git rev-list接收的格式不一致,会导致两个命令实际遍历的对象范围存在差异。例如<my_rev_list>包含多行引用,echo -e可能未正确传递所有引用,或git rev-list未完整解析范围。对象属于未被<my_rev_list>覆盖的隐式引用:那两个对象可能被Git隐式引用指向,比如
refs/stash(暂存的修改)、reflog中的旧提交记录,或是refs/remotes下未被包含在<my_rev_list>中的远程分支。git pack-objects --revs会严格基于输入的rev范围打包可达对象,但如果<my_rev_list>未覆盖这些隐式引用,而pack过程中因依赖关系自动补充了这两个对象,就会出现差异。Git版本或命令行为差异:不同Git版本中,
rev-list --objects和pack-objects --revs的遍历逻辑可能存在细微差异。例如部分旧版本中,rev-list对树对象的遍历可能遗漏深层嵌套的Blob对象,而pack-objects会为保证包的完整性自动补充这些依赖对象。
内容的提问来源于stack exchange,提问作者merlin2011

