git子模块总是分离的,即使在跟踪分支时

时间:2018-12-21 19:24:06

标签: git git-submodules

我将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 checkout v2.43相比,父git repo也不会检测到对子模块的任何修改,然后它确实注意到子模块已被修改。

1 个答案:

答案 0 :(得分:2)

这很正常!

仅当通过git submodule update --rebasegit submodule update --merge或其他一些特殊方式更新子模块时,才使用子模块声明中的分支表示法奇怪的情况。在所有其他时间,每个子模块都有一个分离的HEAD,它是在使用该子模块的超级项目中 gitlink索引条目选择的提交时分离的。

(也就是说,在 superproject 中,某些提交 C 已签出。Commit C 说:当您使用子模块时S,它应该在提交CS上。这东西叫做 gitlink ,它从提交 C 复制到索引,然后复制到{{1} }进入子模块,并以分离的HEAD的形式签出该特定的提交。)