Git子模块跟踪远程分支

时间:2013-11-14 18:59:23

标签: git git-branch git-submodules git-remote

我尝试使用git子模块将10多个存储库聚合到一个结构中,以便于开发。

应该克隆模块并签出分支。 相反,模块以分离头模式检出。

git clone git@github.com:org/global-repository.git
git submodule update —init
cd config-framework
git status

$git status
#HEAD detached at b932ab5
nothing to commit, working directory clean

gitmodules文件似乎没问题

$cat .gitmodules 
[submodule "config-framework"]
        path = config-framework
        url = git@github.com:org/config-framework.git
        branch = MY_BRANCH

我们希望默认情况下检出MY_BRANCH分支,而不是分离头。 我们如何实现这一目标?

3 个答案:

答案 0 :(得分:20)

子模块总是 detached HEAD mode 中签出。

这是因为子模块会检出存储在 special entry in the index of the parent repo 中的SHA1。

另外,如果您希望子模块遵循您在.gitmodules中注册的分支,则需要:

git submodule update --init --remote

--remote将生成git fetch,并结帐新的HEAD
唉,即使结账也是提交,而不是分支(因为在子模块中默认没有本地分支),所以......回到分离的HEAD模式。
请点击“Git submodules: Specify a branch/tag”了解更多信息。

您可以尝试(未测试)a:

git submodule foreach 'git checkout -b $(git config -f /path/to/parent/repo/.gitmodules --get submodule.$path.branch)'

我利用事实git submodule foreach可以访问“$path”,这是子模块目录相对于超级项目的名称。


试图指定子模块的分支在(commit 23d25e4 for Git 2.0)中自动检出....但它被颠倒了(commit d851ffb,2014年4月2日)!
它可能很快就会出现,但目前的实施情况并非如此。

答案 1 :(得分:1)

如果您的计划是为子模块做出贡献,最好的方法是将其作为常规git repo单独检出。你在不同遥控器的分支机构工作吗?然后将子模块指向要用于测试的单个遥控器。

答案 2 :(得分:1)

为了完成此操作,我始终使用以下命令(稍早基于VonC的建议:

export top=$(pwd)
git submodule foreach --recursive 'b=$(git config -f ${top}/.gitmodules submodule.${path}.branch); case "${b}" in "") git checkout ${sha1};; *) git checkout ${b}; git pull origin ${b};; esac'

它在所有子模块的“右”分支(如果已设置)处(递归)检出所有子模块,否则在最后提交的头部检出。