土法炼钢兴趣小组的算法知识备份

【Git 内部】commit-graph 与 reachability bitmap

文章导航

分类入口
opensource
标签入口
#git#git-internals#commit-graph#bitmap#rev-list

目录

大仓库执行 git loggit merge-basegit push --dry-run 时,需要沿 parent 链遍历 commit。纯对象读取成本高,Git 在对象库旁路维护两类只读加速文件commit-graph 缓存提交拓扑与 generation number;pack bitmap 在 pack 旁记录可达性位图,服务 git rev-list 等。

本文说明文件路径与机制边界;不写未实测的性能倍率(WRITING_GUIDE:性能数据须真实跑过)。


一、commit-graph

路径:.git/objects/info/commit-graph(可多文件链 commit-graph-chain,见 gitformat-commit-graph)。

生成:

git commit-graph write

实测单提交仓库生成后:

.git/objects/info/commit-graph   # 约 1 KB 级

作用(概念)

可达性遍历的三层:pack+idx 必需,commit-graph 与 bitmap 可选加速

commit-graph 不改变对象库语义;删除后 Git 回退到读 commit 对象,功能仍正确,仅可能更慢。


二、pack bitmap

路径:与 pack 同名前缀,如 pack-8f8a….bitmap(由 git repack 等在条件满足时生成,依赖 pack.writeBitmaps 等配置)。

作用(概念)

无 bitmap 时命令仍可用;属于优化层。


三、与 maintenance 的关系

git gc 可能重写 pack 并更新 bitmap;commit-graph write 常作为维护任务的一部分(git maintenance / 钩子)。详见 gc/repack


四、实验建议

在本地仓库对比:

git commit-graph write
ls -la .git/objects/info/
git rev-list --count --all

若要做耗时对比,须固定仓库规模、禁用/启用 commit-graph、预热次数 ≥3 并写明 CPU/Git 版本——本系列不收录未完成的 benchmark 数字。


五、本文边界


参考资料

系列索引Git 内部结构 · 上篇delta 压缩 · 下篇gc/repack

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。


By .