Git子模块分离头状态

4
我已将2个子模块subA和subB添加到一个项目中,它们位于externals/subA和externals/subB中。
今天,另一个团队成员提交了他的代码,当使用git status命令在externals/subA和externals/subB中时,subA和subB都显示分离头状态。
我首先尝试了git submodule update,并报告没有错误。然后我尝试了git submodule init和git submodule update,但是没有改变。
我们该如何使子模块重新同步?子模块出现这种情况的原因是什么?这是自从我们开始以来第一次出现这个问题。谢谢。
1个回答

5
一个子模块“根据定义”是在分离的HEAD状态下检出的:它代表着作为gitlink记录在父仓库索引中的特定SHA1。
请参见 "git submodule update" 以确保子模块正在跟踪分支:
# add submodule to track master branch
git submodule add -b master [URL to Git repo];

# update your submodule
git submodule update --remote 
# or (with rebase)
git submodule update --rebase --remote

注意:如此处所示,任何 git submodule update 命令都会自动分离HEAD,即使子模块配置为跟随分支也是如此。
添加测试 git config submodule.<name>.update merge ,因为默认情况下,更新将检出提交(分离的HEAD)。

user859375在评论中添加了内容:

当运行命令“git submodule update --init --recursive”时,git子模块在初始化阶段本身就是分离状态。

我理解git引用和检出gitsubmodules的特定提交。

因此,我们创建了一个脚本来运行“git submodule foreach git checkout master”和“git submodule foreach git pull origin master”等操作。

这样,我们能够在设置本地机器上的repo时保持附加的head状态。
是的,当我们需要更新子模块以反映远程更改时,我们运行“git submodule update --remote --merge”。


它仍然没有跟踪分支。 - user859375
@user859375 你的意思是追踪分支部分不起作用吗? - VonC
“git status” 仍然显示 head detached,所以我想是这样的。 - user859375
阅读完 https://dev59.com/PGMl5IYBdhLWcg3wAC6h#55570998(您也参考了此链接)之后,您应该尝试使用 git config submodule.<name>.update merge,然后查看在 git submodule update --rebase --remote 之后 HEAD 是否仍处于分离状态(在子模块内执行 git status,而不是在父存储库中)。 - VonC
当运行命令“git submodule update --init --recursive”时,git子模块在初始化阶段本身就被分离。我了解git是指特定的提交并检出gitsubmodules。因此,我们创建了一个脚本来运行“git submodule foreach git checkout master”和“git submodule foreach git pull origin master”等其他操作。这样,我们就能够在设置本地机器中的repo时保持附加的head状态。是的,当我们需要更新子模块以反映远程更改时,我们会运行“git submodule update --remote --merge”。感谢回复和确认。 - user859375
@user859375 好的,我已经将您的评论包含在答案中以增加可见性。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接