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

时间:2015-12-08 10:05:05

标签: 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

和暂存

[submodule "submodule"]
        path = submodule
        url = http://fpr-dev/submodule.git
        branch = staging

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

$ git submodule
+e3782f37b1ae23aa0d5537ef3061dfdfec70f77f submodule (heads/Staging)

请注意它说明了。但是当我在子模块中执行git状态时,我看到:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

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

现在,当我切换到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.

我想做的就是:

  • Superproject和子模块应具有相同的分支(Staging,feature,...)。
  • 当将超级项目切换到另一个分支时,我希望子模块跟随超级项目分支(即也切换到该分支)我不在乎是否自动完成或者我必须运行1000行脚本< / LI>
  • 当执行推或拉子模块时,它应该正常工作(即推/拉正确的分支)

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

1 个答案:

答案 0 :(得分: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