在git中,可以并行获取多个远程对象吗?
下面的代码可以在不与存储库中的git文件锁定冲突的情况下工作吗?
git config gc.auto 0
git remote |xargs --max-procs=4 -n 1 git fetch
git gc我对几个存储库进行了小测试,当所有存储库彼此不相关时,它似乎可以工作。
如果有明确的技术原因导致上面的并行抓取命令不起作用,那么得到反馈就更好了。
该子模块支持并行获取,但当使用git-subtree方法时,并行获取会更好。
发布于 2018-08-31 03:24:13
答案实际上是可能的。特别是:
xargs --
-n =4 xargs 1 git远程获取
正如您所看到的,在一定程度上,这在测试时实际上是有效的。我曾经写过一个类似的东西的奇特版本(用奇特的显示控制抓取过程,都是用Python编写的--结果发现git fetch --progress中有一个bug,所以它不能正确地处理管道;你必须使用pty)。
在不与
文件锁定冲突的情况下...当所有存储库彼此不相关时,它似乎可以工作。
这就是问题所在:每次fetch都假设它可以获得它的锁。获取需要锁定每个远程跟踪名称,通常这很好用,因为名称是分开的-远程A不会干扰远程B,因为refs/remotes/A/master和refs/remotes/B/master使用不同的锁-但最终的重新打包可能会失败,除非您按照您所做的那样,禁用自动gc,然后自己运行GC (以后也应该重新启用它)。
您最终可能会获取更多不必要的数据(正如我在另一个答案中指出的)。在没有外部信息的情况下,你对此无能为力,例如,也许有一个遥控器总是你应该首先获取的。
发布于 2022-01-20 04:49:33
它似乎对我来说开箱即用
git fetch -j 8 使用Git 2.33.1。-j开关是--jobs的缩写。我记得早些时候我在寻找这个,但直到今天才发现,开关可能是相当新的。
具有四个GitHub遥控器的存储库的一些计时:
$ \time git fetch --all
Fetching origin
Fetching foo
Fetching bar
Fetching baz
6.40 real 1.28 user 0.21 sys
$ \time git fetch --all -j 8
Fetching origin
Fetching foo
Fetching bar
Fetching baz
2.06 real 1.30 user 0.16 syshttps://stackoverflow.com/questions/52096609
复制相似问题