首页/开发/Git 与协作速查/git repack 手动重打包
进阶与大仓实践69 条

git repack 手动重打包

把松散对象与多个包合并为更少、更紧凑的包;常用 -a -d -b 组合(全量、删除冗余、写位图),大仓可改用 maintenance 的增量重打包。

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

重打包做什么

重打包把仓库里的松散对象与多个包文件合并成更少、更紧凑的包,减少文件数量和占用体积。常用组合是全量重打包并删除冗余包,再写位图索引以便服务端快速取回对象。大仓库可以改用维护命令做增量重打包,避免每次都全量重算。

基本信息

全量组合-a 与 -d 搭配,全量重打包并删除冗余包
位图索引-b 写入位图,便于服务端取回对象
重算压缩-f 重新计算差异压缩,耗时更长
效果核对git count-objects -vH 查看对象数与体积
增量方式可用维护命令执行增量重打包

典型使用场景

  • 对象目录碎片过多、克隆速度下降时做一次整理
  • 服务端仓库为加快取回对象而生成位图索引
  • 历史清理或大文件处理之后重新打包回收空间
  • 维护窗口内安排一次全量重打包
  • 排查体积异常时先看对象统计,再决定是否需要重打包

常用示例

常用示例
git repack -adb                      # 全量重打包并写位图索引
git repack -Ad --quiet               # 静默执行全量重打包
git count-objects -vH                # 查看对象数量与占用体积
git maintenance run --task=incremental-repack  # 增量重打包,适合大仓库

常用选项

选项作用使用建议
-a全量重打包与 -d 组合使用
-d删除冗余包用于释放空间
-b写位图索引服务端仓库建议开启
-f重算差异压缩大仓库上耗时长,谨慎使用
重打包是重活:几十 GB 的仓库先在低峰期试跑,并观察磁盘余量,打包过程会临时占用额外空间。
日常维护更适合用维护命令做增量重打包,全量重打包留给历史整理或体积异常这类明确的时机。
重打包只影响对象在磁盘上的存放方式,不改变提交内容与历史结构。完成后用对象统计对比前后数据,就能确认整理是否生效。

易错点

  • 加上 -f 全量重算差异压缩在大仓库上可能跑很久,非必要不要添加
  • 重打包期间有并发写入可能触发自动垃圾回收,维护窗口需要提前协调
  • 打包过程会临时占用额外磁盘空间,余量不足时可能中断并留下残留包文件
  • 手工删除包文件而不重新打包,或在对象仍被引用时执行清理,可能造成对象丢失

数据来源与参考

  • Git 官方文档:git-repack
  • Git 官方文档:git-count-objects
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌