如何从共享父目录更新多个git存储库,而不用cd'ing到每个repo的根目录?我有以下所有单独的git存储库(不是子模块):

/plugins/cms
/plugins/admin
/plugins/chart

我想一次更新它们,或者至少简化我当前的工作流程:

cd ~/plugins/admin
git pull origin master
cd ../chart
git pull

etc.


当前回答

前5个答案都不适合我,而且这个问题是关于目录的。

这工作:

for d in *; do pushd $d && git pull && popd; done

其他回答

比里奥的解决方案更低技术含量:

for i in */.git; do ( echo $i; cd $i/..; git pull; ); done

这将更新工作目录中的所有Git存储库。不需要显式列出他们的名字(“cms”,“admin”,“chart”)。“cd”命令只影响子shell(使用圆括号派生)。

前5个答案都不适合我,而且这个问题是关于目录的。

这工作:

for d in *; do pushd $d && git pull && popd; done

如果你有很多git仓库的子dirs,你可以使用parallel

ls | parallel -I{} -j100 '
  if [ -d {}/.git ]; then
    echo Pulling {}
    git -C {} pull > /dev/null && echo "pulled" || echo "error :("
  else
     echo {} is not a .git directory
  fi
'

你可以试试这个

find . -type d -name .git -exec sh -c "cd \"{}\"/../ && pwd && git pull" \;

此外,您还可以通过添加一个&&参数来添加自定义输出。

find . -type d -name .git -exec sh -c "cd \"{}\"/../ && pwd && git pull && git status" \;

2010年原答案:

如果所有这些目录都是单独的git repo,则应该将它们作为子模块引用。

这意味着你的“起源”将是远程回购“插件”,其中只包含对子回购“cms”,“管理”,“图表”的引用。

git拉出,然后更新git子模块,就可以实现你想要的结果。


2016年1月更新:

在Git 2.8(2016年第一季度)中,你将能够使用Git fetch——recursive -submodules -j2并行地获取子模块。 参见“如何使用git克隆-递归加速/并行化git子模块的下载?”