如何更新git子模块。

9

我刚刚在应用程序中执行了git merge <merging_branch_name>,并解决了很多冲突。

但是当我执行git status时,我可以看到子模块列表中有(新提交)的消息。看起来子模块(分支/标签)版本没有更新。

例如:

modified:   plugins/myplugin.git (new commits)

如何使用版本(使用<merging_branch_name>)更新子模块?

在git bash中,我会得到以下类似的信息:

my_app (current_branch  |MERGING), 

因此,当我执行git status时,我会得到以下子模块列表:

 modified:   plugins/plugin1.git (new commits)
 modified:   plugins/plugin2.git (new commits)
 modified:   plugins/plugin3.git (new commits)
 modified:   plugins/plugin4.git (new commits)

我该如何解决这个问题?


git add <submodule_path>,就像添加文件一样。 - Яois
3个回答

4

要将子模块的内容更新到新的SHA1值,只需执行以下操作:

# the submodule content needs to be updated
git submodule update --init

# the parent repo needs to record the new submodule SHA1
git add plugins/myplugin

那么,通过运行 1) git add plugins/myplugin 然后 2) git submodule update --init 可以解决这个问题吗? - n92
(假设子模块SHA1在合并后是正确的,如果不是,请参见xxMUROxx的答案。) - VonC
"git add" 没有将插件更新为最新版本。 - n92
@Vinay 仅添加 add 是不够的。需要使用 git submodule update 命令。它将仅更新到父级记录的 SHA1(git ls-tree HEAD | grep 'plugin1.git')。 - VonC
@Vinay 好的,我已经把答案顺序反过来了。 - VonC
显示剩余2条评论

4

假设你有两个分支masterhotfix。在master中,子模块的头部位于123456处,在hotfix中位于abcdef处。(假设abcdef123456更新)。如果你已经检出了master并合并了hotfix,那么子模块的头将移动到abcdef,但是子模块中的代码没有被检出到这个新的头。如果现在输入git diff,你会看到子模块指向123456,但这是不正确的,因为你想要指向abcdef。 如果你现在输入:

git add pathToSubmodule

旧的123456已经添加到索引中。这是错误的提交。你需要做的是将头部移动到正确的提交,只需简单地调用:

git submodule update

我建议不要执行 add 操作,否则您在 master 分支上会得到子模块提交记录 123456 而不是来自合并 hotfix 的更新版本 abcdef - Michael Mairegger
是的,我运行了git add命令,这使我留在了同一个分支。 - n92
我没有将插件更新到最新版本。 - n92

1

子模块基本上指向在父git存储库中进行提交时使用的子模块中的特定提交。看起来,在合并后,子模块比合并后预期的要超前。你有两个选择:

  • 回到子模块当前所指向的提交
  • 更新你的父存储库以使用新的子模块状态

其他人指出了第一个选项。

git submodule update

第二个选项,我认为这就是你所询问的,可以通过以下方式完成。
git add plugins/plugin?.git
git commit -m 'update submodules'

这将更新您的HEAD状态,以存储当前子模块引用。


您可以通过查看以下内容来了解发生了什么:

git ls-tree HEAD | grep 'plugin1.git'

在更新子模块之前和之后,请将此参考与此插件中的当前提交进行比较:

cd plugins/plugin1.git
git rev-parse HEAD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接