背景:对于我们的一个存储库,我有一个嵌套问题,该存储库远程托管在我公司使用的企业版 GitHub 上。
考虑到 repo 的历史,我认为处理它的最简单方法是以某种方式删除旧的硬提交文件,这些文件一开始就不应该提交,这些文件可能直接或通过引用存储在某个地方。它的诀窍是,如果可以帮助,我不想弄乱历史,而且我对更高级的 git 功能了解不多,所以甚至很难知道正确的问题是什么问。
问题:通过 GitSCM 插件通过 Jenkins 拉取/获取 repo 花费的时间太长。大约 10 分钟后超时。这个 repo 有数千个提交和几十个标签要跟踪,所以我不能随意将某个提交设置为开始并截断其余部分的好点。
我的发现:尝试做 GitSCM 插件似乎正在做的事情几乎不会导致问题或时间要求的程度。也就是说,它仍然非常慢,只是不是 10 分钟以上的慢,所以即使插件引入了加剧的性能问题,我们也应该清理它。
可能的优化:我发现几个提交主要是添加了 DLL。此后,这些 DLL 已通过新的提交被删除。但是,与本地文件系统实际使用的大小相比,repo 的大小仍然是数百兆字节。现在,master 分支在.git文件夹外大约 4MB,也就是大约 300MB。
目标:尽可能多地摆脱这 300 MB,而不会因丢失历史/标签而惹恼人们
我已经尝试了许多可能相关问题的解决方案,但是我无法在远程托管存储库被精简到更接近文件系统使用的实际大小的地方得到它。其中一些问题是,
减少 git 存储库大小
如何从 git 存储库中删除未使用的对象?
为什么 git 不会进一步减小存储库的大小?
在尝试了这些问题的解决方案之后,我最终只增加了回购的大小而不是减少它,公平地说,我在其中一个问题的答案中被警告过。
鉴于此问题的背景、问题详细信息以及之前引用的问题,是否可以完成我在远程托管存储库上尝试做的事情,如果可以,我应该具体运行什么或要求我们的 GHE 管理员运行如果我不能亲自进行更新?
这最终导致它增长:
git reflog expire --all --expire=now
git gc --prune=now --aggressive
git filter-branch --index-filter "git rm --cached --ignore-unmatch *.dll" --prune-empty -- --all
git push origin master
但是,在运行前两个命令后,我只看到 .git 文件夹的大小减少了 40 MB;远不及我所希望的,这就是为什么我尝试了序列中的下一个命令,当远程推送时,该命令会导致 repo 增长而不是缩小。对象数从大约 45k 增加到 60k。