18

我正在尝试使用 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 分支,而不是分离头。我们如何做到这一点?

4

3 回答 3

22

子模块总是以分离的 HEAD 模式检出。

这是因为子模块将检查存储在父 repo 索引中的特殊条目中的 SHA1 。

另外,如果你想让一个子模块跟随你在 中注册的分支.gitmodules,你需要:

git submodule update --init --remote

--remote制作一个git fetch,加上一个新的结帐HEAD
唉,即使结帐也将是提交,而不是分支(因为默认情况下您在子模块中没有本地分支),所以......回到分离HEAD模式。在“ Git 子模块:指定分支/标签
”中 查看更多信息。

您可以尝试(未测试):

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

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


曾尝试为要自动签入的子模块指定一个分支(对于 Git 2.0提交 23d25e4)......但它被逆转了(提交 d851ffb,2014 年 4 月 2 日)!
它可能很快就会出现,但不是在当前的实现中。

于 2013-11-16T09:26:13.917 回答
1

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

于 2015-10-03T23:14:54.047 回答
1

为了完成这项工作,我总是使用以下命令(稍微基于前面的 VonCs 提议:

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'

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

于 2018-08-17T10:43:11.817 回答