1

背景:对于我们的一个存储库,我有一个嵌套问题,该存储库远程托管在我公司使用的企业版 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。

4

2 回答 2

1

诀窍是,如果可以帮助的话,我不想弄乱历史,

但你会:一个 git filter-branch 或(更易于使用)一个BFG 回购清理器将重写该回购提交的历史记录(SHA1),迫使你git push --force将最终结果返回到远程回购。
这没什么大不了的,考虑到回购是旧的(即不再积极维护),但仍然必须考虑在内。

通过 GitSCM 插件通过 Jenkins 拉取/获取 repo 花费的时间太长。

Jenkins 根本不应该参与其中:您可以在本地克隆 repo,清理它,然后将其推回。
另外,可以提高 Jenkins 的超时时间。

这最终导致它增长:

这些 reflog/gc 命令应该filter-branch 或 BFG 之后使用,而不是之前。

于 2018-04-17T04:44:53.497 回答
1

我不会接受我自己的答案。VonC 完成了一项令人钦佩的任务,试图在评论中调整答案以满足我非常具体的要求,这可能不会让其他人遇到类似的问题——此外,VonC 确实提到了使用 BFG,这最终让我解除了封锁。只使用它git会很好,但是由于 BFG 是完全免费的(而且比git filter-branch.

为了通过减少.git文件夹中的 repo 大小来解锁我们的远程构建,我使用了免费工具 BFG Repo Cleaner 并完全按照它的说明进行操作。它将.git文件夹的大小从原来的 300MB 缩小到 80MB。考虑到这个 repo 有超过 7k 的提交,我不会抱怨.git文件夹仍然很大。此操作无疑大大加快了克隆 repo 的过程。

如何

完全披露:其中一些步骤直接从 BFG Repo Cleaner 的文档中复制而来,该文档链接到步骤 #2。它还假设您使用的是 Windows,因此请根据需要更新 shell 语法。

  1. 如果您还没有 Java,请安装它
  2. 从他们的网站上获取免费工具 BFG Repo Cleaner,这里也是他们的文档页面
  3. 如果您不想执行与我删除所有文件类型的完全相同的操作.DLL,请查看 BFG 的简短文档以了解还有什么可用的
  4. 打开命令控制台并使用您的 repo 执行浅克隆--mirror,如下所示:
    git clone --mirror https://github.com/some-big-repo.git
  5. 如果java.exe不在您的路径中,请将该目录临时添加到PATHwith Set PATH=%PATH%;C:\PathToJavaBin,或直接调用它,并确保更新 JAR 文件名的此命令,以便以下命令与您的文件系统中的内容匹配,如下所示:
    C:\PathToJavaBin\java.exe -jar C:\PathToBFGJar\bfg.jar --delete-files *.dll some-big-repo.git
  6. cd some-big-repo.git
  7. git reflog expire --expire=now --all
  8. git gc --prune=now --aggressive
  9. git push

就是这样:)

于 2018-04-17T23:49:28.863 回答