首页/开发/Git 与协作速查/multi-pack-index 合并多包索引
进阶与大仓实践69 条

multi-pack-index 合并多包索引

为多个 packfile 维护统一索引(MIDX),让对象查找与仓库操作不必逐个扫描包文件;配合 bitmap 还能加速克隆与取回。

Git 与协作速查开发更新于 2026-10-13

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、批量删除)之后重写一次;日常提交不需要频繁写。

易错点

  • 整理后忘记重写:手工 repack 过的仓库里 MIDX 可能仍指向旧包集合,查找走弯路或 verify 报错,重要整理后统一补一次 write --bitmap
  • 写入中途被打断:Ctrl+C、磁盘写满会留下不一致状态,先 git multi-pack-index verify 检查,再重写修复
  • 把删除 multi-pack-index 文件当清理手段:删掉后对象查找直接退回逐包扫描,性能只会变差;清理旧条目应该用 expire
  • 并发维护:repack 与 MIDX 写入脚本同时跑会竞争同一目录,维护任务串行执行并各自 verify

数据来源与参考

  • Git 官方文档:git-multi-pack-index
  • Git 官方文档:git-repack(--write-midx 相关行为)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌