如何统计本地Git仓库中特定文件占用的总存储空间?
计算Git仓库中特定文件的总占用空间及移除历史后的缩减规模
一、统计文件在提交历史中的总大小
要算出该文件所有历史版本的总字节数,用以下命令(替换<file-path>为你的文件路径):
git log --all --objects --follow -- <file-path> | grep -E '^[0-9a-f]{40}' | git cat-file --batch-check='%(objectsize)' | awk '{sum += $1} END {print sum " bytes"}'
--follow:追踪文件的重命名历史(如果文件曾被改名,必须加这个参数才不会漏算旧版本)- 这条命令会遍历所有包含该文件的提交,提取每个版本的对象哈希,查询每个对象的大小后求和。
二、加上工作树中当前文件的大小
如果该文件还存在于当前工作区,把上面的结果加上工作文件的大小:
# 一键计算总占用空间 history_size=$(git log --all --objects --follow -- <file-path> | grep -E '^[0-9a-f]{40}' | git cat-file --batch-check='%(objectsize)' | awk '{sum += $1} END {print sum}') worktree_size=$(du -b <file-path> | awk '{print $1}') total_size=$((history_size + worktree_size)) echo "Total occupied space: $total_size bytes ($((total_size/1024/1024)) MB)"
三、验证移除文件后仓库的实际缩减空间
上面的统计是理论值,实际清理后仓库的缩减规模可以通过以下步骤验证:
- 先备份原仓库(重要,防止操作失误):
cp -r your-repo your-repo-backup - 移除文件的所有历史记录:
推荐用git filter-repo(Git官方已弃用git filter-branch,filter-repo更稳定高效):cd your-repo git filter-repo --path <file-path> --invert-paths - 清理Git垃圾数据:
git reflog expire --expire=now --all git gc --prune=now --aggressive - 对比备份仓库和处理后仓库的大小:
两者的差值就是实际能缩减的空间。du -sh your-repo your-repo-backup
内容的提问来源于stack exchange,提问作者Thomas Fritz
相关产品推荐
相关产品推荐

