为什么 git Submodule 显示错误的分支

Tho*_*mas 5 git version-control git-submodules

我们有一个超级项目和一个包含在其中的子模块。两者都有相同的分支master, staging, featureBranch

我希望超级项目master跟踪子模块,master超级项目staging跟踪子模块staging

对于超级项目中的主人,它.gitmodules看起来像这样:

[submodule "submodule"]
        path = submodule
        url = http://fpr-dev/submodule.git
        branch = master
Run Code Online (Sandbox Code Playgroud)

并在舞台上

[submodule "submodule"]
        path = submodule
        url = http://fpr-dev/submodule.git
        branch = staging
Run Code Online (Sandbox Code Playgroud)

现在,当我在 master 上做一个时,git submodule我看到以下输出:

$ git submodule
+e3782f37b1ae23aa0d5537ef3061dfdfec70f77f submodule (heads/Staging)
Run Code Online (Sandbox Code Playgroud)

请注意,它说的是登台。但是当我在子模块中执行 git status 时,我看到:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
Run Code Online (Sandbox Code Playgroud)

为什么会这样,我该如何解决?

现在,当我切换到staging并尝试拉 ( git.exe pull -v --progress "origin") 子模块时,出现以下错误:

You asked to pull from the remote 'origin', but did not specify
a branch. Because this is not the default configured remote
for your current branch, you must specify a branch on the command line.
Run Code Online (Sandbox Code Playgroud)

我想做的就是:

  • Superproject 和 submodule 应该有相同的分支(Staging,feature,...)。
  • 当将超级项目切换到不同的分支时,我希望子模块跟随超级项目分支(即也切换到该分支)我不在乎这是自动完成的还是我必须运行 1000 行脚本
  • 在子模块中进行推或拉时,它应该可以正常工作(即推/拉正确的分支)

实现这种行为的最简单方法是什么?

Kio*_*tch 0

当您运行时,git submodule它会显示您的子模块的正确提交 SHA,因为这是您在超级项目中设置的。该命令不会告诉您当前本地子模块代码引用的提交 SHA;它告诉你想要的超级项目想要参考。

不幸的是,您必须采取额外的步骤来告诉您的超级项目在本地提取特定的子模块代码。这是通过运行以下命令来完成的:

git submodule init

git submodule update

之后,您应该在本地子模块中看到正确的代码。唯一可以绕过这些额外命令的时候是第一次克隆存储库时。你可以这样称呼:

git clone <repo_name> --recursive

并且所有子模块都将在正确的提交 SHA 处检出。但是,一旦签出新分支,您就必须再次运行initupdate命令。

要自动执行此行为,您可以创建一个要运行的脚本,而不是git checkout直接使用命令。该脚本可以接受分支名称,并且看起来像这样:

git checkout <branch_name>

git submodule init

git submodule update

  • 我这样做了:(cd mysubmodule &amp;&amp; git checkout mybranch &amp;&amp; git submodule init &amp;&amp; git submodule update),之后子模块报告了正确的分支,但父模块仍然说子模块位于旧分支上。 (4认同)