如何更新 git 子模块

How to update git submodule

我刚刚在应用中做了一个git merge <merging_branch_name>,解决了很多冲突。

但是当我执行 git status 时,我可以在消息中看到带有(新提交)的子模块列表。 看起来子模块 (branch/tag) 版本尚未更新。

例如:

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)

我该如何解决这个问题?

要将子模块内容更新为新的 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

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

git add pathToSubmodule

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

git submodule update

子模块基本上指向在父 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