我正在尝试使用 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 分支,而不是分离的头。 我们如何实现这一目标?
子模块始终以分离的HEAD模式检出。
这是因为子模块将检出存储在父存储库索引中特殊条目中的 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
”,即相对于超级项目的子模块目录的名称。
尝试为要自动检出的子模块指定一个分支( for Git 2.0)....但它被逆转了(commit d851ffb,2014 年 4 月 2 日)!
它可能很快就会到来,但目前还没有实现。
在 评论中建议:
当在父存储库的根目录中运行时,此命令不需要调整:
git submodule foreach --recursive "git config -f $(pwd)/.gitmodules --get submodule.\$path.branch"
True:
$(pwd)
(在
git submodule foreach
命令的上下文中)从运行命令的上下文(父存储库的根)计算once。 它始终正确指向父级的
.gitmodules
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'
它(递归地)检查其“右”分支(如果设置)的所有子模块,否则检查最后提交的头部。