如何从共享父目录更新多个git存储库,而不用cd'ing到每个repo的根目录?我有以下所有单独的git存储库(不是子模块):
/plugins/cms
/plugins/admin
/plugins/chart
我想一次更新它们,或者至少简化我当前的工作流程:
cd ~/plugins/admin
git pull origin master
cd ../chart
git pull
etc.
如何从共享父目录更新多个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 }
其他回答
前5个答案都不适合我,而且这个问题是关于目录的。
这工作:
for d in *; do pushd $d && git pull && popd; done
最紧凑的方法,假设所有子dirs都是git回购:
ls | parallel git -C {} pull
我的拙见是
显示当前路径(使用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 \;
这应该是自动发生的,只要cms, admin和chart都是存储库的一部分。
一个可能的问题是这些插件都是git子模块。
运行git帮助子模块查看更多信息。
EDIT
在bash中这样做:
cd plugins
for f in cms admin chart
do
cd $f && git pull origin master && cd ..
done
比里奥的解决方案更低技术含量:
for i in */.git; do ( echo $i; cd $i/..; git pull; ); done
这将更新工作目录中的所有Git存储库。不需要显式列出他们的名字(“cms”,“admin”,“chart”)。“cd”命令只影响子shell(使用圆括号派生)。