如何计算Git仓库子文件夹的提交大小及整体仓库占比?
嘿,针对你关于Git仓库子文件夹大小分析的两个问题,我给你整理了实用的方法,结合你的foo/src和foo/test结构来讲解:
1. 计算Git仓库中子文件夹的提交生命周期大小 & 空间占用
Git是基于对象存储的,不是传统的文件夹结构,所以要统计子文件夹的相关大小,得过滤出所有和该文件夹相关的提交、对象来计算。
方法一:统计/test所有历史提交对应的文件大小总和(提交生命周期)
这个方法会遍历所有修改过/test的提交,累加每个提交里该文件夹下文件的大小:
- 先获取所有涉及
/test修改的提交哈希:git log --all --pretty=format:"%H" -- test/ - 用组合命令直接计算这些提交中
/test文件的总大小:
这个命令会逐个检查每个涉及git log --all --pretty=format:"%H" -- test/ | while read commit; do git diff-tree -r --no-commit-id --name-only $commit | grep "^test/" | while read file; do git cat-file -s $commit:$file done done | awk '{sum += $1} END {print "Total size of test/ files across all commits: " sum " bytes (" sum/1024/1024 " MB)"}'/test的提交,提取出该提交里属于/test的文件,然后获取每个文件在该版本的大小,最后累加求和。
方法二:统计/test所有历史版本对象的总空间占用
如果想知道/test在Git对象数据库里的总存储空间(包括所有历史版本的文件,去重后的Blob大小),可以这么做:
- 先找出所有和
/test相关的唯一Blob对象哈希:git rev-list --all --objects | grep "^test/" | awk '{print $1}' - 统计这些Blob的总大小:
注意:Git会自动去重相同内容的文件,所以这个统计的是真正被git rev-list --all --objects | grep "^test/" | awk '{print $1}' | while read blob; do git cat-file -s $blob done | awk '{sum += $1} END {print "Total space used by test/ (all historical versions): " sum " bytes (" sum/1024/1024 " MB)"}'/test占用的独特存储空间,不会重复计算相同内容的文件。
2. 计算/test对整体仓库大小的贡献占比
要算占比,我们需要先拿到仓库的总大小,再和/test的空间大小做对比:
- 先优化仓库存储(确保统计的是最优大小):
git gc --aggressive - 获取仓库的总存储大小(
.git文件夹的大小就是仓库的实际占用空间):total_size=$(du -b .git/ | awk '{print $1}') - 用上面方法获取
/test的总空间大小,然后计算占比:# 获取test文件夹所有历史对象的总大小 test_size=$(git rev-list --all --objects | grep "^test/" | awk '{print $1}' | while read blob; do git cat-file -s $blob; done | awk '{sum += $1} END {print sum}') # 计算占比(保留两位小数) percentage=$(echo "scale=2; ($test_size / $total_size)*100" | bc) echo "test/ folder contributes $percentage% of the total repository size ($test_size bytes out of $total_size bytes)"
小提示:如果你的仓库很大,这些命令可能会运行一段时间,耐心等一下就好~
内容的提问来源于stack exchange,提问作者user3915489
相关产品推荐
相关产品推荐

