首页/开发/Git 与协作速查/定位历史中的大文件
进阶与大仓实践69 条

定位历史中的大文件

用 rev-list --objects 列出全部对象并交给 cat-file --batch-check 统计大小,是找出「历史里是谁把仓库撑大」的常规手段。

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

定位历史大文件是什么

用 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=<哈希> 定位到底是哪次提交引入的,再谈清理或迁移。大仓库建议把完整输出保存到文件留档,便于不同时期对比与复盘。

易错点

  • 几百 GB 历史全量扫描耗时明显,低峰期执行并重定向到文件,避免终端刷屏与超时。
  • 路径列在重命名历史下可能显示旧路径:按对象哈希进一步追踪引入提交更准。
  • 扫描结果是快照:清理或迁移后要重新扫描验证效果,并与远端仓库状态同步。
  • 只看当前分支会漏掉其他分支上的大对象,--all 才是全量口径,漏了会低估体积。
  • 清理大对象前确认它没有被发布产物、镜像或外部系统按哈希引用,贸然动手会破坏可追溯性。

数据来源与参考

  • Git 官方文档:git-rev-list(--objects)
  • Git 官方文档:git-cat-file(--batch-check)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌