Git以递归方式更新子模块

com*_*lez 260 git git-submodules

我的项目结构

ProjectA
-FrameworkA (submodule)
--Twig (submodule of FrameworkA)
Run Code Online (Sandbox Code Playgroud)

我如何递归更新子模块?我已经尝试了一些git命令(在ProjectA上)

git submodule foreach git pull origin master
Run Code Online (Sandbox Code Playgroud)

要么

git submodule foreach --recursive git pull origin master
Run Code Online (Sandbox Code Playgroud)

但是不能拉扯Twig的文件.

dre*_*wag 555

git submodule update --recursive
Run Code Online (Sandbox Code Playgroud)

您可能还希望使用--init选项来初始化任何未初始化的子模块:

git submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)

注意:在某些旧版本的Git中,如果使用该--init选项,则可能无法更新已初始化的子模块.在这种情况下,您还应该运行不带--init选项的命令.

  • @Irineau如果使用`--init`,那么关于已经初始化的子模块没有被更新的注释与我在Git 2.2.2上的经验不符.我看到已经初始化的顶级和嵌套子模块在我使用`git submodule update --init --recursive`时检出了正确的提交,并且我认为你需要在有和没有的情况下运行命令`--init`完全错了.除非某人能够证明这是行为或证明它在版本之间发生了变化并且曾经是真的,否则我打算完全编辑它. (3认同)
  • @MarkAmery,我记得在某些版本的git中这是一个我不记得的问题.我刚刚在1.9.3中测试了它,问题似乎不再存在了.我更新了答案以引用模糊的"旧版本".如果任何人都可以指定哪个版本更改了此行为,那就太棒了. (3认同)
  • 你可以只做一个“git submodule add blah”然后“git submodule update --init --recursive”。 (2认同)

Wil*_*ken 31

我使用的方式是:

git submodule update --init --recursive
git submodule foreach --recursive git fetch
git submodule foreach git merge origin master
Run Code Online (Sandbox Code Playgroud)

  • 我的工作是将最后一行更改为:`git submodule foreach git pull --ff-only origin master` (5认同)
  • 我还将在最后一行添加--recursive:“ git子模块foreach --recursive git merge origin master”,否则当它本身更新了子模块时,您可能会得到一个肮脏的子模块。 (2认同)

Seb*_*tte 17

因为它可能会发生,你的子模块的默认分支都没有 master(发生了很多我的情况),这是我如何自动化全Git的子模块的升级:

git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'
Run Code Online (Sandbox Code Playgroud)


mrt*_*rts 12

在最近的Git(我正在使用v2.15.1)中,以下内容将递归地将上游子模块更改合并到子模块中:

git submodule update --recursive --remote --merge
Run Code Online (Sandbox Code Playgroud)

您可以添加--init初始化任何未初始化的子模块,--rebase如果要进行rebase而不是merge,则使用它们.

您需要在之后提交更改:

git add . && git commit -m 'Update submodules to latest revisions'
Run Code Online (Sandbox Code Playgroud)


小智 11

怎么样

git config --global submodule.recurse true
Run Code Online (Sandbox Code Playgroud)

忘记它了吗?

请参阅git 书籍文档