Git 子模块来跟踪远程分支

问题描述 投票:0回答:3

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

它应该克隆模块并签出分支。 相反,模块会在分离头模式下检出。

git clone [email protected]: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 = [email protected]:org/config-framework.git
        branch = MY_BRANCH

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

git git-branch git-submodules git-remote
3个回答
25
投票

子模块始终分离的HEAD模式检出。

这是因为子模块将检出存储在父存储库索引中特殊条目中的 SHA1。 另外,如果您希望子模块遵循您在

.gitmodules

中注册的分支,您需要:

git submodule update --init --remote

--remote

将生成

git fetch
,并签出新的
HEAD
唉,即使签出也是提交,而不是分支(因为默认情况下子模块中没有本地分支),所以......回到分离的
HEAD
模式。
请参阅“
Git 子模块:指定分支/标签
”。 你可以尝试(未测试)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 日)! 它可能很快就会到来,但目前还没有实现。

2024 年 6 月:
user368683

评论中建议:

当在父存储库的根目录中运行时,此命令不需要调整:

git submodule foreach --recursive "git config -f $(pwd)/.gitmodules --get submodule.\$path.branch"


True:
$(pwd)

(在

git submodule foreach
命令的上下文中)从运行命令的上下文(父存储库的根)计算
once
它始终正确指向父级的 .gitmodules
文件,无需进一步适应不同的子模块路径。
    


1
投票


1
投票

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'

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

© www.soinside.com 2019 - 2024. All rights reserved.