我该如何计算子文件夹的生命周期git commit大小?整个git存储库大小中占据了多少子文件夹?

时间:2019-04-09 14:45:47

标签: git github git-commit

我的git repo看起来像这样 foo(root) / src /测试 在foo,src和test下有两个文件夹,我可以使用git gc命令来计算总体回购大小 但我想知道/ test在整个回购规模中的贡献

1 个答案:

答案 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并没有删除一些旧的碎片-您所有不相关的提交和文件仍保留在本地存储库中。有两种替代方法可以清除它。

  1. 最简单的方法-将存储库克隆到其他磁盘位置(因此不会克隆不相关的远程引用)并在那里修剪存储库:
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-但这需要更多的编码。

我喜欢这种解决方案,因为它是通过命令行完成的,并直接在最后给出答案。