首页 > 解决方案 > 并行获取多个 Git 遥控器

问题描述

在 git 中,是否可以并行获取多个遥控器?

下面的工作是否会与存储库中的 git 文件锁定冲突。

git config gc.auto 0
git remote |xargs --max-procs=4 -n 1 git fetch
git gc

我对几个存储库进行了小测试,当所有存储库彼此无关时,它似乎可以工作。

如果有明确的技术原因导致上述并行获取命令不起作用,那么获得反馈会很好。

子模块支持并行获取,但在使用 git-subtree 方法时并行获取会很好。

类似的问题:git pull multiple remotes in parallel

标签: git

解决方案


答案其实是也许。尤其是:

git remote | xargs --max-procs=4 -n 1 git fetch

正如您所看到的,在一定程度上,这在测试时实际上是有效的。我曾经写过一个相同类型的东西的精美版本(带有对获取过程的精美显示控制,全部用 Python 编写 - 但事实证明,在 中存在一个错误git fetch --progress,因此这不适用于管道;你必须使用 ptys)。

不与 git 文件锁定冲突......当所有存储库彼此无关时,它似乎工作。

这就是问题所在:每次 fetch 都假设它可以得到它的锁。提取需要锁定每个远程跟踪名称,并且通常工作得很好,因为名称是分开的 - 远程A不会干扰远程B,因为refs/remotes/A/masterrefs/remotes/B/master使用不同的锁 - 但最终重新打包可能会失败,除非你做你所做的,禁用自动-gc然后自己运行 GC(你也应该在之后重新启用它)。

您最终可能还会获取比必要更多的数据(正如我在另一个答案中指出的那样)。如果没有外部信息,您对此无能为力,例如,也许您应该始终首先获取一个遥控器。


推荐阅读