git 子模块始终分离,即使在跟踪分支时也是如此

git submodule is always detached, even when tracking branch

我有一个 git 子模块配置为跟踪特定分支:

[submodule "subproject"]
path = subproject
url = ../subproject.git
branch = v2.44

在我的构建脚本中,我希望能够查询子项目的分支,所以我使用了cd subproject && git rev-parse --abbrev-ref HEAD。我希望它输出 v2.44,但它总是输出 HEAD.

当我进入 subproject/ 并检查分支时,我得到:

git branch -v
* (HEAD detached at b69ac07) b69ac07 Another commit
  master                     36096e7 Some commit

这是怎么回事?为什么我会分离而不是在 v2.44 分支?

如果我手动 git checkout v2.44,父 git 存储库也不会检测到对子模块的任何修改,而如果我 git checkout v2.43 然后它确实注意到子模块已修改。

这很正常!

仅当通过 git submodule update --rebase 或 [=11] 更新 子模块时,才使用子模块声明中的 branch 符号=],或其他一些特殊的古怪案例。在所有其他时间,每个子模块都有一个分离的 HEAD,在使用子模块的超级项目中的 gitlink 索引条目 选择的提交处分离。

(也就是说,在超级项目中,一些提交C被签出。提交C 说:当你使用子模块 S 时,它应该在提交 CS 上。 这个东西叫做 gitlink 并且它从提交 C 到索引,然后 git submodule update 进入子模块并检查该特定提交,作为分离的 HEAD。)