如何并行地同步多个 Git 仓库?

一直想搞清楚怎么弄,昨天搭建 EmacsWiki ELPA 的时候又遇到了这个问题,像下面这样共有 645 个 Git 仓库需要同步

[email protected]:emacsmirror/a-menu.git
[email protected]om:emacsmirror/abbrev-complete.git
[email protected]:emacsmirror/ac-dabbrev.git
...
[email protected]:emacsmirror/keyword-arg-macros.git
[email protected]:emacsmirror/thing-edit.git
[email protected]:emacsmirror/yaoddmuse.git

package-build.el 的做法是在 Emacs 调用 Git 一个一个更新 git clone/fetch,这样会非常慢,有没有专门的工具或者方法可以同时更新多个 Git 仓库?感觉这样能提高效率。

如果是我的话,就会用python的多进程,开50个进程,每个进程clone 一个repo。

https://www.gnu.org/software/parallel/

MELPA 有近 4000 个包,每次更新需要 3 个小时,或许不该花这么长时间。

可以试试git的子模块功能,会不会更有效率...

1 个赞

我想你指的是 git-submodule-j 选项吧,这个主意应该可行,有空我试试。

   -j <n>, --jobs <n>
       This option is only valid for the update command. Clone new
       submodules in parallel with as many jobs. Defaults to the
       submodule.fetchJobs option.
printf '%s\0' ~/projects/dotfiles/*(/) | xargs -n1 -P8 -0i git --work-tree={} fetch
2 个赞

子模块功能似乎很坑, 谨慎为好

如果考虑在 Emacs 内部解决的话,等有时间试试 (info "(elisp) Threads") 或者 (info "(elisp) Asynchronous Processes") / async-start-process。如果可行的话,straight.el 中的 straight-fetch-all 会因此收益。