繁体   English   中英

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

[英]How can i calculate subfolder's life time git commit size?How much subfolder is occupying in overall git repository size?

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

可以有两种不同的方法,但是最简单的方法是重写存储库历史记录,以便仅将/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,但是就地进行所有操作(从此答案中获取 ):

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日志中的提交并遵循对象引用来计算其树和Blob占用了多少/test 空间 -但这需要更多的编码。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM