如何将分离的HEAD子模块附加到实际HEAD?

28

当我像这样向 Git 子模块添加到一个 Git 存储库中时,

git submodule add ssh://server/proj1/ proj1
git submodule init
git submodule update

添加的子模块将处于分离的 HEAD 模式。我不太清楚它是什么,但我知道子模块将链接到目标仓库的特定版本。

我不知道它实际上是如何工作的,不过看起来那里存在一个代理分支。我通过切换到主分支解决了这个问题。

cd proj1
git checkout master

这将切换当前分支实际主分支HEAD,但这不会更新链接。因此,如果您再次克隆整个存储库,它仍将链接到旧版本。

如果我想始终将其链接到最新版本(HEAD),该怎么办?


请注意,子模块现在可以跟踪分支。请查看我的编辑答案。 - VonC
在看到这篇文章之后,我发现了这个链接https://dev59.com/3mIi5IYBdhLWcg3w9gJy#20797186,觉得很有启发性。 - dtmland
可能是如何协调分离的HEAD和主/原点(master/origin)?的重复问题。 - Julio Marins
1个回答

34

2013年3月更新

Git 1.8.2 增加了跟踪分支的可能性。

"git submodule" 开始学习一种新的模式,与远程分支的最新状态进行集成(而不是与超级项目的 gitlink 中记录的提交进行集成)。

# add submodule to track master branch
git submodule add -b master [URL to Git repo];

# update your submodule
git submodule update --remote 

还可以参考Vogella的子模块教程

添加子模块后会使用分离 HEAD 模式

是的,子模块是关于引用特定提交而不是分支的。
所以:

  • 如果您检出一个提交的SHA1(或标记),则处于分离HEAD模式。
  • 如果您检出分支(就像您对子模块的主分支所做的一样),则可以在该分支之上创建其他提交(但您将必须返回到父存储库以便提交该父存储库,因为您需要记录您创建的新的子模块提交)

有关更多信息,请参见“子模块的真实本质”。

如果您始终希望获得另一个存储库的最新提交,则最简单的方法是将它们合并在一起(例如使用子树合并)。
请参见“合并两个相同存储库GIT”以获取详细信息和参考资料。


1
一张留言纸,仅供以后参考。我不需要“子树合并”,如果“子模块”可以良好支持追踪,则应该是答案。 - eonil
@Eonil 但是如果你需要的话,它确实非常支持跟踪。简单来说,它的主要功能是记录一个固定版本。 - VonC
有人能帮忙吗?我正在遵循这两个 Git 1.8.2 命令,每次我对 repo 进行全新克隆时,子模块仍然会变成分离状态,而不是指向我们的“开发”分支。有什么想法吗? - FateNuller
2
@FateNuller 是的,这就是子模块的本质:它始终是*分离的。您可以在.gitmodules文件中添加指令以指示其更新,但这并不改变父存储库记录该子模块的SHA1,并且任何后续克隆都将在该SHA1处检出子模块,分离的。 - VonC
1
@VonC 是的,我只希望有一种选项,能够告诉 git 自动为每个子模块检出特定的分支。 - electronix384128
显示剩余2条评论

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