我们有100多个git repos,有时我想grep一切。
要更新回购,我使用这个:
for repo in *; do (cd $repo; git checkout master; git pull); done
这很慢。
如何加快速度?
一次运行所有更新会产生太多的进程。
我需要一种方法来减less对N个工人的负载。
有人解决这个问题吗?
例如,您可以使用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
你可以使用GNU parallel来完成这个任务。 从GNU并行的主页,
“作业也可以是一个从pipe道中读取的命令,然后GNU并行可以分割input,并将其input到命令中。”
有一个很好的教程, 这个特定的部分解决了你所问的问题。
编辑:这是你可以使用的命令。 (从Ole Tang的回答中略微修改)
parallel -j<number of jobs to run> 'cd {} && git checkout master && git pull' ::: */
这将触发你所指定的并行“工作数目”,并执行你所要求的任何工作。
HTH
使用GNU并行它看起来像这样:
parallel -j77 'cd {} && git checkout master && git pull' ::: */
这给了77名工人。
GNU并行是一个通用的并行程序,可以很容易地在同一台机器或多台你有ssh访问的机器上并行运行作业。 它通常可以代替一个for循环。
如果你想在4个CPU上运行32个不同的作业,那么最简单的方法就是在每个CPU上运行8个作业:

当一个完成时,GNU并行会产生一个新的进程 – 保持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
观看介绍video: https : //www.youtube.com/playlist? list = PL284C9FF2488BC6D1
浏览教程: http : //www.gnu.org/software/parallel/parallel_tutorial.html
注册邮件列表以获得支持: https : //lists.gnu.org/mailman/listinfo/parallel