verify-pack 是什么
git verify-pack 逐个对象列出包里对象的类型与体积:SHA、类型、原始大小、包内压缩后大小与偏移。它用于定位仓库里体积异常的 blob——先找大对象、再反查它出现在哪些提交里,最后决定迁 LFS、重写历史还是转为制品管理。输出可能非常大,务必先过滤再统计。
基本信息
| 用法 | git verify-pack -v .git/objects/pack/*.idx |
|---|---|
| 输出列 | SHA、类型、大小、包内大小、偏移 |
| 增量对象 | 还会附深度与基线对象 SHA |
| 反查 | git rev-list --objects --all 配合过滤定位路径 |
| 对象类型 | blob、tree、commit、tag |
典型使用场景
- 仓库体积异常:找出占空间最大的 blob 再决定处置
- 历史清理前置:确认大文件存在与路径,准备 filter-repo
- 迁移 LFS 评估:统计需要迁移的对象总量与体积
- 排查单包损坏:verify-pack 报错时定位坏包与坏对象
- 检查误提交:复盘历史上误提交的大二进制
找出大对象
找出大对象
git verify-pack -v .git/objects/pack/*.idx \ # 逐对象列出信息
| awk '$2 == "blob" {print $1, $3, $4}' \ # 只保留 blob 的 SHA 与大小
| sort -k2 -nr | head -20 # 按原始大小降序取前 20
git rev-list --objects --all | grep <大对象SHA> # 反查对象出现的提交
git cat-file -s <大对象SHA> # 查看对象字节大小输出逐列读法
| 列 | 含义 | 备注 |
|---|---|---|
| SHA | 对象哈希 | 反查路径与提交用 |
| type | 对象类型 | blob 是文件内容 |
| size | 原始大小 | 判断检出与传输成本 |
| 包内大小 | 压缩后大小 | 判断磁盘占用 |
| 偏移 | 包内位置 | 工具解析用 |
| 深度 | 增量链长度 | 出现在增量行,越深读取成本越高 |
包内大小与原始大小是两回事:磁盘占用看压缩后,检出与传输成本看原始大小,排序时要明确用哪个,报告里注明口径避免误读。
确认大对象来源后再决定处理方式:迁 LFS、重写历史删除,或改为制品管理,三者的影响面完全不同。