如何从共享父目录更新多个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.
当前回答
从父目录运行以下命令,在本例中是插件:
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。
其他回答
比里奥的解决方案更低技术含量:
for i in */.git; do ( echo $i; cd $i/..; git pull; ); done
这将更新工作目录中的所有Git存储库。不需要显式列出他们的名字(“cms”,“admin”,“chart”)。“cd”命令只影响子shell(使用圆括号派生)。
从父目录运行以下命令,在本例中是插件:
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。
2010年原答案:
如果所有这些目录都是单独的git repo,则应该将它们作为子模块引用。
这意味着你的“起源”将是远程回购“插件”,其中只包含对子回购“cms”,“管理”,“图表”的引用。
git拉出,然后更新git子模块,就可以实现你想要的结果。
2016年1月更新:
在Git 2.8(2016年第一季度)中,你将能够使用Git fetch——recursive -submodules -j2并行地获取子模块。 参见“如何使用git克隆-递归加速/并行化git子模块的下载?”
你可以试试这个
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" \;
这应该是自动发生的,只要cms, admin和chart都是存储库的一部分。
一个可能的问题是这些插件都是git子模块。
运行git帮助子模块查看更多信息。
EDIT
在bash中这样做:
cd plugins
for f in cms admin chart
do
cd $f && git pull origin master && cd ..
done