首页 > 解决方案 > 我如何计算子文件夹的生命周期 git commit 大小?在整个 git 存储库大小中占用了多少子文件夹?

问题描述

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

标签: gitgithubgit-commit

解决方案


可能有几种不同的方法,但最简单的一种是重写存储库历史记录,以便只/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目录的内容处于 repo 状态(并且该文件夹成为项目的根目录)。但是,Git 并没有删除一些旧的 crud——所有不相关的提交和文件仍然保存在本地存储库中。有两种替代方法可以清理它。

  1. 最简单的一个 - 将 repo 克隆到不同的磁盘位置(因此不会克隆不相关的远程引用)并在那里修剪 repo:
cd ..
git clone location1 location2
cd location2
git gc --prune=now


2.更老套的一个,但在原地做所有事情(取自这个答案):

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目录并检查存储库大小减少了多少。/test 或者,您可以创建一个程序/脚本来检查 Git 日志中的提交并遵循对象引用来计算其树和 blob 占用了多少空间——但这需要更多的编码。

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


推荐阅读