在git中,可以并行获取多个遥控器吗?
下面的工作将不会与存储库中的git文件锁定冲突。
git config gc.auto 0
git remote |xargs --max-procs=4 -n 1 git fetch
git gc
我对多个存储库进行了小型测试,当所有存储库彼此无关时,它似乎可以正常工作。
如果有明确的技术原因导致上述并行获取命令不起作用,则很高兴获得反馈。
该子模块支持并行获取,但是在使用git-subtree方法时,并行获取会很好。
答案 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 c3d6b70的Nguyễ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
”将始终在主提取进程(*)上运行。(*),即使我们将来某个时候并行获取远程服务器,也应该没问题,因为我们应该在此步骤之前“加入”所有这些进程。