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

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

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

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

etc.


当前回答

你可以试试这个

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" \;

其他回答

从父目录运行以下命令,在本例中是插件:

find . -type d -depth 1 -exec git --git-dir={}/.git --work-tree=$PWD/{} pull origin master \;

澄清:

找到。搜索当前目录 -type d查找目录,而不是文件 -depth 1表示最大一个子目录深度 -exec {} \;为每次查找都运行自定义命令 git - git-dir ={} /。git——work-tree=$PWD/{} pull git获取单个目录

要使用find,我建议使用echo after -exec来预览,例如:

find . -type d -depth 1 -exec echo git --git-dir={}/.git --work-tree=$PWD/{} status \;

注意:如果没有-depth 1选项,请尝试-mindepth 1 -maxdepth 1。

如果你有很多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
'

我用这个

for dir in $(find . -name ".git")
do cd ${dir%/*}
    echo $PWD
    git pull
    echo ""
    cd - > /dev/null
done

Github

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

这工作:

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

最紧凑的方法,假设所有子dirs都是git回购:

ls | parallel git -C {} pull