我的git repo看起来像这样 foo(root) / src /测试 在foo,src和test下有两个文件夹,我可以使用git gc命令来计算总体回购大小 但我想知道/ test在整个回购规模中的贡献
答案 0 :(得分:2)
可以有两种不同的方法,但是最简单的方法是重写存储库历史记录,以便仅保留/test
的历史记录。然后我们可以计算出它所占用的磁盘空间。
首先,将存储库克隆到磁盘上的某个位置:
git clone <url> location1
cd location1
现在确保您所有的存储库分支都作为本地分支签出,以便在以后重写存储库时将保留它们的历史记录。为此,获取存储库分支的列表并检出每个分支:
git for-each-ref --format="%(refname:lstrip=3)" refs/remotes/ | xargs -L1 git checkout
解决方案的核心-我们删除除/test
之外的所有其他文件夹:
git filter-branch --subdirectory-filter test -- --all
此时,仅/test
目录的内容处于回购状态(该文件夹成为项目的根目录)。但是,Git并没有删除一些旧的碎片-您所有不相关的提交和文件仍保留在本地存储库中。有两种替代方法可以清除它。
cd ..
git clone location1 location2
cd location2
git gc --prune=now
2.更加hacky,但是可以就地完成所有操作(摘自this answer):
git remote rm origin
rm -rf .git/refs/original/ .git/refs/remotes/ .git/*_HEAD .git/logs/
git for-each-ref --format="%(refname)" refs/original/ | xargs -n1 git update-ref -d
git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 -c gc.rerereunresolved=0 -c gc.pruneExpire=now gc
这些方法中的任何一种都会从与当前存储库状态无关的所有对象中清除存储库。
现在我们准备评估/test
文件夹历史记录的大小:
du -h -s .git
这使您了解文件夹及其历史记录对存储库大小的贡献程度。
可能还有其他两种方法。例如,您可以尝试使用相同的方法过滤存储库,但是这次删除/test
目录,并检查repo大小减少了多少。或者,您可以创建一个程序/脚本,该程序/脚本将检查Git日志中的提交并遵循对象引用来计算多少/test
space is taken by its tree and blobs-但这需要更多的编码。
我喜欢这种解决方案,因为它是通过命令行完成的,并直接在最后给出答案。