我们有一个超级项目和一个子模块。两者都具有相同的分支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.
我想做的就是:
实现此行为的最简单方法是什么?
答案 0 :(得分:0)
运行git submodule
时,它会显示子模块的正确提交SHA,因为这是您在超级项目中设置的。该命令不会告诉您当前本地子模块代码引用的SHA的提交情况;它告诉你想要超级项目想要来引用。
不幸的是,您必须采取额外步骤,告诉您的超级项目在本地下拉该特定子模块代码。这是通过运行以下命令来完成的:
git submodule init
git submodule update
在此之后,您应该在本地子模块中看到正确的代码。您唯一可以绕过这些额外命令的时候是第一次克隆回购。你可以这样称呼:
git clone <repo_name> --recursive
并且将在正确的提交SHA处检出所有子模块。但是,只要您签出新分支,就必须再次运行init
和update
命令。
要自动执行此行为,您可以创建一个您将运行的脚本,而不是直接使用git checkout
命令。该脚本可以接受分支名称,看起来像这样:
git checkout <branch_name>
git submodule init
git submodule update