【问题标题】:Git update submodules recursivelyGit递归更新子模块
【发布时间】:2012-04-27 10:44:58
【问题描述】:

我的项目结构

ProjectA
-FrameworkA (submodule)
--Twig (submodule of FrameworkA)

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

git submodule foreach git pull origin master

git submodule foreach --recursive git pull origin master

但无法拉取 Twig 的文件。

【问题讨论】:

标签: git git-submodules


【解决方案1】:
git submodule update --recursive

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

git submodule update --init --recursive

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

【讨论】:

  • 递归添加子模块怎么样? “git submodule add FrameworkA.git”只是拉取FrameworkA的文件。
  • 你可以只做一个“git submodule add blah”然后“git submodule update --init --recursive”。
  • 这和我下面的方式不同吗?
  • @Irineau 如果使用--init,则有关已初始化子模块未更新的说明与我在 Git 2.2.2 上的经验不符。当我使用git submodule update --init --recursive 时,我看到已经初始化的顶级子模块和嵌套子模块都检查了正确的提交,我认为你需要在有和没有--init 的情况下运行命令的说法是完全错误的。除非有人可以证明这是行为的证据,或者证明它在版本之间发生了变化并且曾经是真实的,否则我计划将其完全编辑掉。
  • @MarkAmery,我记得这是某个我不记得的 git 版本中的问题。我刚刚在 1.9.3 中测试过,问题似乎不再存在。我更新了答案以引用模糊的“旧版本”。如果有人可以指定哪个版本改变了这种行为,那就太好了。
【解决方案2】:

我的使用方式是:

git submodule update --init --recursive
git submodule foreach --recursive git fetch
git submodule foreach git merge origin master

【讨论】:

  • 我将最后一行更改为:git submodule foreach git pull --ff-only origin master
  • 过去三个小时一直在寻找这个。谢谢你,先生。除此之外,您还可以使用这些命令进行提交,例如:git submodule foreach --recursive 'git commit -a | :'。无论结果如何,: 都会使其循环。见linkstackoverflow.com/questions/19728933/…
【解决方案3】:

由于您的子模块的默认分支可能是 not 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'

【讨论】:

  • 我试图在我的generic Makefile 中添加这个命令,但我仍然坚持让 GNU Make ignore 解释 $(...) 序列,尽管它存在于简单的引号中。有人有想法吗?
  • 您的命令正是我所需要的,谢谢!但我得到:Entering 'Core' fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working tree. 其中Core 是子模块
  • 另外,我想你需要弄清楚这条评论stackoverflow.com/a/18008139/3383543
  • 没有递归选项意味着这仅在您的子模块不再包含子模块时才有效。
【解决方案4】:

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

git submodule update --recursive --remote --merge

您可以添加--init 来初始化任何未初始化的子模块,如果您想变基而不是合并,请使用--rebase

您需要在之后提交更改:

git add . && git commit -m 'Update submodules to latest revisions'

【讨论】:

  • 这个,我以为我做错了什么,但您的回答向我证实git submodule update --remote my-dir/my-submodule 也可以正常工作
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 2012-07-09
  • 2017-08-13
相关资源
最近更新 更多