我有一个拥有成千上万个远程库的 repo,我想一次从成千上万个远程库中进行拉取,最好可以指定同时进行的最大数量。在 manpages、谷歌或 git-scm 在线上,我没能找到与此相关的东西。请注意:我不想在多个 repo 上运行一个命令,我只有一个拥有成千上万个远程库的 repo。这与子模块无关,请不要讨论子模块。子模块与 Git 远程库无关。
git fetch
进程,则其中一些锁定可能会发生冲突。remoteA
、remoteB
和remoteC
收集,如果remoteB
通常(但不总是)是remoteA
和remoteC
的超集,则可能会发现10000个共同对象在remoteB
上,与其他两个相比。尽管这也适用于顺序的git fetch
操作,但它变得不那么重要。例如,假设有5000个对象-一些提交、一些树和一些blob-在A上,您尚未拥有,5000个对象在C上,而所有10000个对象在B上。如果您按任何顺序顺序提取,您将先获取5k,然后5k,然后0;或者10k,然后0,然后0;因为当您移动到下一个远程时,您已经收集并存储了5k或10k个传入的对象。但是,如果您同时执行所有三个操作,您将带入5k、5k和10k个对象,只有然后才会发现您的工作量增加了一倍。
git bundle
,然后按顺序扫描(如运行git fetch
)已完成的捆绑包,并更新给定远程的元数据。 - torek从 Git 2.24 开始,使用 [--jobs]
选项可以实现 并行获取 多个远程仓库。
以下是一些示例:
获取 3 个远程仓库,其中 2 个将会并行获取:
git fetch -j2 --multiple remote1 remote2 remote3
获取所有远程分支,将并行获取5个远程分支:
git fetch -jobs=5 --all
如果你有成千上万的远程仓库,不想下载它们所有的内容,而是将它们分成一些逻辑组。你可以在 .git/config 文件中定义远程仓库组,而不是在命令行中指定它们(使用 --multiple
选项)。
[remotes]
group1 = remote1 remote2 origin
group2 = remote55 remote66
然后在fetch命令中使用这个组。
这个命令:git fetch --multiple -j4 group1 group2 remote10
会同时获取 remote1 remote2 origin remote55 remote66 remote10
这几个远程仓库,且会并行进行4次获取。
git pull
。git fetch --jobs=0
”(man)曾经会触发BUG(),现在已经修复以使用可用的CPU。
请参阅 提交 c39952b(2023年2月20日),由Matthias Aßhauer (rimrul
)完成。
(由Junio C Hamano -- gitster
--于提交 d180cc2中合并,2023年2月24日)
在 51243f9("run-command API:不要回退到
fetch
:再次使用--jobs=0
选择合理的默认值报告者:Drew Noakes
签署者:Matthias Aßhauer
online_cpus()
",2022-10-12,Git v2.39.0-rc0 -- merge列在batch #7中)之前,git
fetch --multiple
--jobs=0``(man)会选择一些默认的作业数量,类似于git -c fetch.parallel=0 fetch --multiple
(man)。fetch.parallel
会回退到“合理的默认值”,但对于--jobs
也做同样的事情是有意义的。online_cpus()
而不是BUG()出现问题。
这修复了“--jobs=0
不再工作(git-for-windows/git
issue 4302)”