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

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

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

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

etc.


当前回答

实际上,如果你不知道子文件夹是否有一个git repo,最好是让find get repos为你:

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

PowerShell的等效代码是:

Get-ChildItem -Recurse -Directory -Hidden -Filter .git | ForEach-Object { & git --git-dir="$($_.FullName)" --work-tree="$(Split-Path $_.FullName -Parent)" pull origin master }

其他回答

我的拙见是

显示当前路径(使用python,方便和只是工作,参见如何获得文件的完整路径?) 直接查找.git子文件夹:在非git子文件夹中发出git命令的几率很低 删除一些查找警告

遵循:

find . \
    -maxdepth 2 -type d \
    -name ".git" \
    -execdir python -c 'import os; print(os.path.abspath("."))' \; \
    -execdir git pull \;

当然,你也可以添加其他带有-execdir选项的git命令,例如显示分支:

find . \
    -maxdepth 2 -type d \
    -name ".git" \
    -execdir python -c 'import os; print(os.path.abspath("."))' \; \
    -execdir git branch \;
    -execdir git pull \;

如果你有很多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 . -maxdepth 1 -type d -name .git -execdir git pull \;

这应该是自动发生的,只要cms, admin和chart都是存储库的一部分。

一个可能的问题是这些插件都是git子模块。

运行git帮助子模块查看更多信息。

EDIT

在bash中这样做:

cd plugins
for f in cms admin chart
do 
  cd $f && git pull origin master && cd ..
done

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

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。