git - 我如何计算子文件夹的生命周期 git commit 大小?在整个 git 存储库大小中占用了多少子文件夹?
问题描述
我的 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
目录的内容处于 repo 状态(并且该文件夹成为项目的根目录)。但是,Git 并没有删除一些旧的 crud——所有不相关的提交和文件仍然保存在本地存储库中。有两种替代方法可以清理它。
- 最简单的一个 - 将 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 占用了多少空间——但这需要更多的编码。
我喜欢这个解决方案,因为它只是通过命令行完成并在最后直接给出答案。
推荐阅读
- tensorflow - Darkflow 在演示上准确,但在代码上不准确
- algorithm - 通过 n 个中间节点找到从 a 到 b 的最小路径
- java - 如何在没有弹簧安全的情况下使用 api 密钥保护 rest api
- php - PHP使用pdo选择数据进入数组并使用数据
- scala - 这与 akka 演员类中的自我
- sql - 有没有办法默认触发器在特定用户上运行以进行 DML 操作?
- java - 本演示中的 JVM 内存分配和释放说明了吗?
- c# - EmguCV旧版本的haarcascade嘴微笑xml
- excel - VBA excel 打开带有外部链接的文档
- python - Scipy.optimize.linprog:值错误 - 输入无效