【发布时间】:2018-04-17 03:12:51
【问题描述】:
背景:我的一个存储库有一个嵌套问题,该存储库远程托管在我公司使用的企业版 GitHub 上。
考虑到 repo 的历史,我认为处理它的最简单方法是以某种方式删除旧的硬提交文件,这些文件一开始就不应该提交,这些文件可能直接或通过引用存储在某个地方。它的诀窍是,如果可以帮助,我不想弄乱历史,而且我对更高级的 git 功能了解不多,所以甚至很难知道正确的问题是什么问。
问题: 通过 GitSCM 插件通过 Jenkins 拉取/获取 repo 花费的时间太长。大约 10 分钟后超时。这个 repo 有数千个提交和几十个标签要跟踪,所以我不能随意将某个提交设置为一个好的起点并截断其余部分。
我的发现: 尝试做 GitSCM 插件似乎正在做的事情并不会导致问题或时间要求的程度。也就是说,它仍然非常慢,只是不到 10 分钟以上,所以即使插件引入了加剧的性能问题,我们也应该清理它。
可能的优化:我发现有几个提交主要是添加了 DLL。此后,这些 DLL 已通过新的提交被删除。但是,与本地文件系统实际使用的相比,存储库的大小仍然是数百兆字节。现在,master 分支在.git 文件夹之外大约 4MB,大约 300 MB。
目标:尽可能多地删除这 300 MB,而不会因丢失历史记录/标签而惹恼人们
我已经尝试了许多可能相关问题的解决方案,但我无法将远程托管存储库精简到更接近文件系统使用的实际大小的位置。其中一些问题是,
Reduce git repository size
How to remove unused objects from a git repository?
Why won’t git further reduce the repository size?
在尝试了这些问题的解决方案后,我最终只增加了 repo 的大小而不是减少它,公平地说,我在其中一个问题的答案中被警告过。
鉴于此问题的背景、问题详细信息以及之前引用的问题,是否可以完成我在远程托管存储库上尝试做的事情,如果可以,我应该具体运行什么或询问我们的 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。
【问题讨论】:
标签: git github jenkins-plugins github-enterprise .git-folder