如何在不cd进入每个repo的根目录的情况下从共享父目录更新多个git存储库?我有以下几个单独的git存储库(不是子模块):
/plugins/cms
/plugins/admin
/plugins/chart
Run Code Online (Sandbox Code Playgroud)
我想一次更新它们或者至少简化我当前的工作流程:
cd ~/plugins/admin
git pull origin master
cd ../chart
git pull
Run Code Online (Sandbox Code Playgroud)
等等
leo*_*leo 282
从父目录运行以下命令,plugins在这种情况下:
find . -type d -depth 1 -exec git --git-dir={}/.git --work-tree=$PWD/{} pull origin master \;
Run Code Online (Sandbox Code Playgroud)
澄清:
find . 搜索当前目录-type d 找到目录,而不是文件-depth 1 最大深度为一个子目录-exec {} \; 为每个查找运行自定义命令git --git-dir={}/.git --work-tree=$PWD/{} pull git拉出各个目录要使用find,我建议使用echoafter -exec进行预览,例如:
find . -type d -depth 1 -exec echo git --git-dir={}/.git --work-tree=$PWD/{} status \;
Run Code Online (Sandbox Code Playgroud)
注意:如果该-depth 1选项不可用,请尝试-mindepth 1 -maxdepth 1.
Dmi*_*ich 173
ls | xargs -I{} git -C {} pull
Run Code Online (Sandbox Code Playgroud)
要并行执行:
ls | xargs -P10 -I{} git -C {} pull
Run Code Online (Sandbox Code Playgroud)
Ing*_*idt 52
比leo的解决方案更低技术:
for i in */.git; do ( echo $i; cd $i/..; git pull; ); done
Run Code Online (Sandbox Code Playgroud)
这将更新工作目录中的所有Git存储库.无需明确列出其名称("cms","admin","chart")."cd"命令仅影响子shell(使用括号生成).
小智 22
我用这个:
find . -name ".git" -type d | sed 's/\/.git//' | xargs -P10 -I{} git -C {} pull
Run Code Online (Sandbox Code Playgroud)
通用:更新当前目录下的所有git存储库.
Gil*_*das 17
实际上,如果你不知道子文件夹是否有一个git repo,最好是让find你获得回购:
find . -type d -name .git -exec git --git-dir={} --work-tree=$PWD/{}/.. pull origin master \;
Run Code Online (Sandbox Code Playgroud)
PowerShell等价物将是:
Get-ChildItem -Recurse -Directory -Hidden -Filter .git | ForEach-Object { & git --git-dir="$($_.FullName)" --work-tree="$(Split-Path $_.FullName -Parent)" pull origin master }
Run Code Online (Sandbox Code Playgroud)
Jam*_*ong 11
这应该是自动发生的,只要cms,admin和chart是存储库的所有部分.
一个可能的问题是这些插件中的每一个都是一个git子模块.
运行git help submodule以获取更多信息.
编辑
为了在bash中这样做:
cd plugins
for f in cms admin chart
do
cd $f && git pull origin master && cd ..
done
Run Code Online (Sandbox Code Playgroud)
eva*_*low 11
该mr实用程序(又名myrepos)提供了一个优秀的解决方案,这非常的问题.使用您最喜欢的软件包管理器安装它,或者直接从github获取mr脚本并将其放入或放在其他地方.然后,到这些repos共享的父文件夹,并创建一个基本文件,其内容类似于以下内容(根据需要调整URL):$HOME/binPATHcdplugins.mrconfig
# File: .mrconfig
[cms]
checkout = git clone 'https://<username>@github.com/<username>/cms' 'cms'
[admin]
checkout = git clone 'https://<username>@github.com/<username>/admin' 'admin'
[chart]
checkout = git clone 'https://<username>@github.com/<username>/chart' 'chart'
Run Code Online (Sandbox Code Playgroud)
之后,您可以mr up从顶级plugins文件夹运行以从每个存储库中提取更新.(注意,这也将做初步克隆如果目标工作副本尚不存在).你可以执行包括其他命令mr st,mr push,mr log,mr diff,等跑mr help,看看什么是可能的.有一个mr run命令可以作为传递,允许您访问不直接支持的VCS命令mr(例如,mr run git tag STAGING_081220015).您甚至可以创建自己的自定义命令,执行针对所有repos的任意位shell脚本!
mr是一个非常有用的工具,用于处理多个回购.由于该plugins文件夹位于您的主目录中,您可能也会感兴趣vcsh.与之配合使用mr,它提供了一种管理所有配置文件的强大机制.请参阅Thomas Ferris Nicolaisen撰写的这篇博文,了解概述.
cmc*_*nty 10
最紧凑的方法,假设所有子目录都是git repos:
ls | parallel git -C {} pull
Run Code Online (Sandbox Code Playgroud)
前 5 个答案中没有一个对我有用,问题是关于目录的。
这有效:
for d in *; do pushd $d && git pull && popd; done
Run Code Online (Sandbox Code Playgroud)
我简陋的建筑
.git子文件夹:在非 git 子文件夹中发出 git 命令的可能性很小find如下:
find . \
-maxdepth 2 -type d \
-name ".git" \
-execdir python -c 'import os; print(os.path.abspath("."))' \; \
-execdir git pull \;
Run Code Online (Sandbox Code Playgroud)
当然,您可以添加其他带有附加-execdir选项的git 命令,find例如显示分支:
find . \
-maxdepth 2 -type d \
-name ".git" \
-execdir python -c 'import os; print(os.path.abspath("."))' \; \
-execdir git branch \;
-execdir git pull \;
Run Code Online (Sandbox Code Playgroud)
你可以试试这个
find . -type d -name .git -exec sh -c "cd \"{}\"/../ && pwd && git pull" \;
Run Code Online (Sandbox Code Playgroud)
此外,您还可以通过添加另一个 && 参数来添加自定义输出,例如。
find . -type d -name .git -exec sh -c "cd \"{}\"/../ && pwd && git pull && git status" \;
Run Code Online (Sandbox Code Playgroud)
我综合了一些评论和答案的观点:
find . -maxdepth 1 -type d -name .git -execdir git pull \;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
88132 次 |
| 最近记录: |