MIDX 是什么
multi-pack-index(简称 MIDX)是 Git 在 .git/objects/pack 下维护的一份跨包对象索引:对象分散在多个 packfile 时,查找不必逐个包扫描,直接查这份统一索引。它由大仓工具链引入,反复 fetch 后小包越积越多的仓库收益最明显;配合包位图(bitmap)还能加速对象遍历、服务端取回与历史扫描类操作。它只改变索引布局,不动对象数据本身。
基本信息
| 写入 | git multi-pack-index write [--bitmap] |
|---|---|
| 校验 | git multi-pack-index verify |
| 清理 | git multi-pack-index expire(清掉已被新包覆盖的旧条目) |
| 位置 | .git/objects/pack/multi-pack-index(位图存于同目录) |
典型使用场景
- fetch 频繁的仓库:小 pack 堆积后对象查找变慢,重写 MIDX 合并查找视角
- 大仓克隆与取回加速:服务端可基于 MIDX 位图复用既有包数据
- 维护脚本收尾:repack 或 gc 之后补写一次,保证索引反映最新包集合
- 对象库健康检查:verify 确认 MIDX 与当前包集合一致
- 体积观察辅助:结合 git count-objects 对比整理前后的包数量与体积
常用示例
常用示例
git multi-pack-index write --bitmap # 为当前所有 pack 建立统一索引与位图
git multi-pack-index verify # 校验索引与包集合是否一致
git repack -adb # 全量重打包并生成位图(包集合被重建)
git multi-pack-index write --bitmap # 整理后重写,让 MIDX 覆盖最新包集合
git count-objects -vH # 对比整理前后的包数量与体积子命令对照
| 命令 | 作用 | 适用时机 |
|---|---|---|
| write | 生成或更新 MIDX,可带 --bitmap 位图 | 小包堆积、repack 与 gc 之后 |
| verify | 校验 MIDX 与对象库一致性 | 维护脚本门禁、怀疑索引损坏 |
| expire | 移除已被新包覆盖的过期条目 | 重打包合并了旧包之后 |
| write --stdin-packs | 按标准输入给的包列表重建 | 增量维护、只处理部分包 |
| repack -adb | 重打包全量对象并写位图 | 常规大整理的前置动作 |
MIDX 是索引层优化:写好后对象仍在原包里,真正减少包数量靠 repack 与 gc,两者配合使用。verify 失败多半是包集合变化后没有重写,不代表对象损坏。
bitmap 与 MIDX 需要反映最新包集合才有意义:重大整理(gc、repack、批量删除)之后重写一次;日常提交不需要频繁写。