定位历史大文件是什么
用 git rev-list --objects --all 列出全部提交可达的对象,交给 git cat-file --batch-check 输出每个对象的类型、大小与路径,再用 awk 过滤 blob、sort 排序找出最大者。这是回答「是谁把仓库撑大」的标准两步法,输出可直接用于决定清理历史还是迁移 LFS。
基本信息
| 用途 | 统计历史中每个 blob 体积,找出占用大户 |
|---|---|
| 工具组合 | rev-list --objects --all + cat-file --batch-check |
| 输出字段 | 类型、哈希、字节数、路径(%(rest) 字段) |
| 后续动作 | 交 filter-repo 清理历史,或迁移到 LFS |
| 耗时 | 大仓库全量扫描明显偏慢,重定向到文件分析 |
典型使用场景
- 仓库体积异常:先找最大的一批对象,再决定清理还是迁移。
- 迁移 LFS 前评估:确认哪些路径与类型是主要占用,制定跟踪规则。
- 推送被拒排查:定位超过平台阈值的文件及其出现的历史路径。
- 定期巡检:季度跑一次扫描并归档结果,观察仓库增长曲线。
- 清理效果验证:filter-repo 前后各跑一次,对比体积变化。
- 单个对象复查:git cat-file -s <哈希> 可直接看大小,git cat-file -t <哈希> 看类型。
统计脚本(bash)
统计脚本(bash)
git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | awk '$1 == "blob" {print $3, $4}' | sort -nr | head -30
# 一步到位:按字节数倒序取前 30 个大对象
# 输出格式:字节数 路径(路径可能显示重命名前的旧名)
git log --all --find-object=<blob哈希> --oneline # 定位引入该对象的提交输出字段读法
| 字段 | 含义 | 备注 |
|---|---|---|
| objecttype | 对象类型,blob 即文件内容对象 | 过滤只留 blob 才有意义 |
| objectname | 对象哈希 | 配合 --find-object 定位提交 |
| objectsize | 对象字节数 | 越大越值得关注 |
| rest | 路径名(按树遍历顺序显示) | 可能为历史某阶段的旧路径 |
路径列来自对象树遍历,重命名过的文件可能显示旧路径;拿到大对象哈希后,用 git log --all --find-object=<哈希> 定位到底是哪次提交引入的,再谈清理或迁移。大仓库建议把完整输出保存到文件留档,便于不同时期对比与复盘。