commit-graph 是什么
commit-graph 是一个把提交之间的父子关系与代次信息预先算好的二进制图形文件。有了它,git log、merge-base、rev-list 这类需要反复遍历历史的命令不必每次重新解析每个提交对象,在大仓库上提速明显。它属于可再生缓存:丢了重新生成即可,不必当成不可替代的数据。
基本信息
| 写入 | git commit-graph write --reachable |
|---|---|
| 增量写入 | git commit-graph write --reachable --split |
| 校验 | git commit-graph verify |
| 自动更新 | 由 gc.writeCommitGraph 控制,较新版本默认随 gc 生成 |
| 文件位置 | .git/objects/info/commit-graph |
典型使用场景
- 大仓库里 git log 与行级追溯明显变慢时做一次历史加速
- CI 中频繁做合并基查找与三路比较,缩短单个流水线耗时
- 历史被重写(变基、过滤类操作)之后重新生成,避免用过期图形
- 排查性能问题时先确认图形文件是否已生成、是否通过校验
- 仓库例行维护中与垃圾回收一起定期执行
常用示例
常用示例
git commit-graph write --reachable # 为所有可达提交写入图形文件
git commit-graph write --reachable --split # 增量写入,避免每次全量重写
git commit-graph verify # 校验文件完整性
git gc # 常规维护会顺带更新图形文件
time git log --oneline -5 --graph # 简单对照命令耗时子命令读法
| 命令 | 作用 | 说明 |
|---|---|---|
| write --reachable | 生成图形文件 | 覆盖所有可达提交 |
| write --split | 增量写入 | 适合频繁更新的仓库 |
| verify | 校验文件 | 检查是否损坏或与对象库不一致 |
图形文件是可再生的缓存:一旦怀疑过期或损坏,删除后重新写入比手工修补更简单,也不会影响仓库数据完整性。
每次重写历史(变基、过滤类操作、仓库搬迁)之后建议重新生成,否则历史类命令可能依据旧图形给出前后不一致的结果。
图形文件只记录提交对象的父代关系等元信息,不包含文件内容,所以它加速的是历史遍历而不是检出文件。大仓库通常把图形文件、多项索引与定期维护策略一起使用,日常命令的响应速度才会稳定下来;只做其中一项,收益往往被其他环节抵消。