并行获取多个Git遥控器

时间:2018-08-30 12:02:24

标签: 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

2 个答案:

答案 0 :(得分:1)

答案实际上是也许。特别是:

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

如您所见,这在测试时实际上一直有效。我曾经写过一个类似的东西的高级版本(具有对抓取过程的高级显示控制,全部用Python编写-事实证明git fetch --progress中存在一个错误,因此无法正常工作)管道;您必须使用pty)。

  

在不与git文件锁定冲突的情况下...当所有存储库彼此无关时,它似乎可以正常工作。

这就是麻烦所在:每次获取都假定可以获取其锁。提取操作需要锁定每个远程跟踪名称,并且由于名称是分开的,因此通常可以正常工作—远程A不会干扰远程B,因为refs/remotes/A/master和{{1} }使用不同的锁,但最终的重新打包可能会失败,除非您执行了操作,禁用了自动{refs/remotes/B/master然后自己运行GC(之后还应该重新启用它)。

您还可能最终获取了不必要的数据(如我在另一个答案中所述)。没有外部信息,您将无能为力,例如,您应该始终首先获取一个遥控器。

答案 1 :(得分:1)

  

,但是除非您执行了操作,禁用auto-gc然后自己运行GC,否则最终的重新打包可能会失败

实际上,对于Git 2.23(2019年第三季度),可能不再需要。

git fetch”,它是从一组学习如何运行 auto-gc仅在最后一次。

请参见commit c3d6b70Nguyễn Thái Ngọc Duy (pclouds)(2019年6月19日)。
(由Junio C Hamano -- gitster --commit 892d3fb中合并,2019年7月9日)

  

fetch:在获取多个遥控器时仅运行一次“ gc

     

在多遥控器模式下,为n-1个遥控器启动git-fetch,最后一个遥控器由当前进程处理。这些过程中的每一个都将最后运行'gc'。

     

这不是真正的问题,因为即使运行多个'gc --auto'   同时我们仍然可以正确处理它。
  但是,它确实显示了多个“在后台自动打包”消息。
  而且,gc实际运行时,我们可能会浪费一些资源,因为在检查锁定并将其移至后台之前,我们仍然会做一些事情。

     

因此,我们尝试避免这种情况。

     

无论如何添加所有对象和引用之后,我们只需要运行一次'gc'。

     

添加新的选项--no-auto-gc,这些选项将由这些n-1进程使用。
  “ gc --auto”将始终在主提取进程(*)上运行。

     

(*),即使我们将来某个时候并行获取远程服务器,也应该没问题,因为我们应该在此步骤之前“加入”所有这些进程。