在所有子目录上运行git pull

Pet*_*tah 220 git bash

如何在不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.

  • 从git 1.8.5开始,可以用-C选项替换--git-dir和--work-tree,参见[this question](http://stackoverflow.com/questions/5083224/git-pull-while - 不是-IN-A-git的目录). - 我正在使用`find.-mindepth 1 -maxdepth 1-type d -print -exec git -C {} pull \;` (67认同)
  • 我用'找到.-maxdepth 1-type d -print -execdir git --git-dir = {}/.git --work-tree = $ PWD/{} pull origin master \;`在执行拉动之前输出文件夹的名称,摆脱警告,只对子文件夹进行拉动. (26认同)
  • find:warning:你在非选项参数-type之后指定了-depth选项,但是选项不是位置的(-depth影响在它之前指定的测试以及之后指定的测试).请在其他参数之前指定选项. (13认同)
  • 用'fetch origin master:master`替换'pull origin master'告诉git用origin的master分支显式更新你的'master'分支.这个**不会合并**,如果你这样做,任何对master的提交都将丢失. (4认同)
  • 如@Rystraum所提到的@ZsoltSzilagy你可以使用`-maxdepth 1`而不是`-depth 1` (2认同)

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)

  • 太好了!我把它作为别名放在我的.gitconfig中:`all ="!f(){ls | xargs -I {} git -C {} $ 1;}; f"`现在我可以做`git all pull` ,`git all'结账大师"`等 (35认同)
  • 我一起打破了一些答案,为macOS上的git创建了这个过滤包含.git文件夹的文件夹,并允许你运行任意命令,如`git all fetch --prune`:`git config --global alias.all '!f(){ls -R -d*/.git | sed's,\/.git ,,'| xargs -P10 -I {} git -C {} $ 1; }; f'` (6认同)
  • 比borisdiakur命令略有改进,以避免在`.`上运行并打印出每个瞬间运行的目录:`git config --global alias.all'!f(){ls -R -d*/.git | xargs -I {} bash -c"echo {} && git -C {} /../ $ 1"; }; f'` (6认同)
  • 清理了一下,将仅递归搜索所有目录只有git repos,并将删除颜色,以防你有别名`ls -R --directory --color = never*/.git | sed's /\/ .git //'| xargs -P10 -I {} git -C {} pull` (4认同)
  • @AWrightIV实际上,`ls -R -d * /。git`返回当前文件夹中包含`.git`目录的目录的过滤列表。这样,当我运行“ git all fetch”之类的东西时,它只会对具有.git文件夹的子文件夹执行。这是对原始问题的解答,但它通过不假设所有子目录都是git repos来尝试提高效率。 (2认同)
  • 如果你想避免非 git 目录,它将是 ```bash ls -R -d */.git | 切-d'。' -f1 | xargs -I{} git -C {} 拉 `` (2认同)
  • 这个答案是最好的:`ls | xargs -P10 -I{} git -C {} pull` (2认同)

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(使用括号生成).

  • 替代使用 `git -C`: `for i in */.git; 执行 git -C $i pull; 完成` (3认同)

小智 22

我用这个:

find . -name ".git" -type d | sed 's/\/.git//' |  xargs -P10 -I{} git -C {} pull
Run Code Online (Sandbox Code Playgroud)

通用:更新当前目录下的所有git存储库.

  • 您可以使用`--git-dir`代替`-C`直接传入`.git`路径,无需替换sed!```找到。-name ".git" -type d | xargs -P10 -I{} git --git-dir={} pull``` (3认同)

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)

  • 出于好奇 - 你为什么不使用ssh键呢? (5认同)

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)


Rya*_*yan 9

前 5 个答案中没有一个对我有用,问题是关于目录的。

这有效:

for d in *; do pushd $d && git pull && popd; done
Run Code Online (Sandbox Code Playgroud)


Raf*_*ffi 7

我简陋的建筑

  • 显示当前路径(使用python,方便且有效,请参阅如何获取文件的完整路径?
  • 直接查找.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)


Chi*_*iya 5

你可以试试这个

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)


小智 5

gitfox 是在所有子仓库上执行命令的工具

npm install gitfox -g
g pull
Run Code Online (Sandbox Code Playgroud)


Nic*_*ick 5

我综合了一些评论和答案的观点:

find . -maxdepth 1 -type d -name .git -execdir git pull \;
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

88132 次

最近记录:

8 年 前