我们有超过 100 个 git 存储库,有时我想要grep
全部覆盖。
要更新 repos,我使用这个:
for repo in *; do (cd $repo; git checkout master; git pull); done
这相当慢。
如何加快速度?
一次运行所有更新会产生太多进程。
我需要一种方法来减少 N 个工人的负担。
有人有解决这个问题的方法吗?
答案1
您可以使用 GNU parallel 来完成此任务。从 GNU parallel 的主页来看,
“作业也可以是从管道读取的命令。GNU parallel 可以拆分输入并将其并行传输到命令中。”
有很好的教程和这具体部分解决了您所问的具体问题。
编辑:这是您可以使用的命令。(根据 Ole Tang 的回答略有修改)
parallel -j<number of jobs to run> 'cd {} && git checkout master && git pull' ::: */
这将触发您指定的并行“作业数”并执行您要求执行的任何操作。
高血压
答案2
您可以使用 xargs 来完成这项工作,例如
(for repo in *
do
[ -d ${repo} ] && echo ${repo}
done ) | xargs -I{} -P4 ./gitActions.sh {}
该标志-P4
告诉 xargs 最多同时运行 4 个进程,以便您可以使用您想要/需要的进程数量。
然后你的 gitActions.sh 文件应该包含:
#!/bin/bash
repo=$1
cd $repo; git checkout master; git pull
答案3
使用 GNU Parallel 它看起来像这样:
parallel -j77 'cd {} && git checkout master && git pull' ::: */
它有77名工人。
GNU Parallel 是一个通用并行化器,可让您在同一台机器或通过 ssh 访问的多台机器上轻松并行运行作业。它通常可以替代循环for
。
如果你想在 4 个 CPU 上运行 32 个不同的作业,那么并行化的直接方法是在每个 CPU 上运行 8 个作业:
当一个进程完成时,GNU Parallel 会生成一个新进程 - 保持 CPU 活跃,从而节省时间:
安装
如果您的发行版未包含 GNU Parallel,您可以进行个人安装,此操作无需 root 访问权限。只需 10 秒即可完成,操作如下:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
对于其他安装选项,请参阅http://git.savannah.gnu.org/cgit/parallel.git/tree/README
了解更多
查看更多示例:http://www.gnu.org/software/parallel/man.html
观看介绍视频:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
完成教程:http://www.gnu.org/software/parallel/parallel_tutorial.html
注册电子邮件列表以获取支持:https://lists.gnu.org/mailman/listinfo/parallel