如何查看目录对Git仓库总大小的实际贡献(含历史与Git压缩)
如何计算Git仓库中vendor目录的实际历史+压缩后大小贡献
要准确评估vendor/目录对Git仓库总大小的真实影响——包括它的所有历史版本,以及Git自带的打包压缩机制带来的变化——你可以试试下面这几种方法,都是原生Git命令或者轻量工具,能拿到精确数据支撑你的讨论:
方法一:对比移除vendor前后的仓库打包大小
这是最直观的方法:通过临时移除仓库历史中所有vendor/相关的内容,对比处理前后的仓库打包大小差值,就是它的实际贡献。
步骤如下:
- 先备份原仓库(绝对重要,避免误操作破坏历史):
git clone --mirror your-repo-url temp-repo-mirror cd temp-repo-mirror - 移除所有历史中的vendor目录:
推荐用Git 2.22+自带的git filter-repo(比旧的filter-branch更稳定可靠):git filter-repo --path vendor/ --invert-paths - 计算处理后的仓库打包大小:
先让Git完成全量打包压缩,再统计:
记下输出里的git gc --aggressive --prune=now git count-objects -Hsize-pack值(这是打包压缩后的仓库总大小)。 - 回到原仓库做同样的打包统计:
在你的原仓库目录执行:git gc --aggressive --prune=now git count-objects -H - 计算差值:原仓库的
size-pack减去处理后的size-pack,就是vendor/目录考虑历史和压缩后的真实大小贡献。
方法二:直接统计vendor目录所有历史对象的大小总和
如果你不想修改仓库,也可以直接遍历所有涉及vendor/的Git对象,计算它们的压缩后大小总和:
total_size=0 # 先找出所有历史中出现过的vendor下的文件 while read file; do # 遍历该文件的所有历史提交版本 for commit_hash in $(git log --all --pretty=format:%H -- "$file"); do # 获取该版本文件的压缩后大小(Git存储的对象都是压缩后的) file_size=$(git cat-file -s "$commit_hash:$file") total_size=$((total_size + file_size)) done done < <(git log --all --pretty=format: --name-only -- vendor/ | sort -u) # 转换为MB单位输出 echo "$((total_size / 1024 / 1024)) MB"
这个结果会略大于方法一的差值(因为Git打包时会自动去重共享内容),但已经非常接近真实贡献值,适合快速估算。
方法三:使用git-sizer工具(更全面的分析)
如果需要更详细的维度——比如vendor目录里哪些文件贡献最大、历史版本的重复率、松散对象占比等——可以用官方推荐的git-sizer工具:
- 安装完成后,在仓库目录执行:
它会输出git-sizer --verbose --path=vendor/vendor/目录相关的所有大小统计,数据非常细致,能帮你定位具体的大小来源。
这些方法都能帮你拿到精准的数据,用来支撑你关于vendored code对仓库大小影响的讨论。
内容的提问来源于stack exchange,提问作者semi
相关产品推荐
相关产品推荐

