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

Eon*_*nil 25 git git-submodules

当我将Git子模块添加到这样的Git存储库时,

git submodule add ssh://server/proj1/ proj1
git submodule init
git submodule update
Run Code Online (Sandbox Code Playgroud)

添加的子模块将处于分离的HEAD模式.我不知道那是什么,但我知道子模块将链接到目标存储库的特定修订版.

我不知道它是如何工作的,无论如何它看起来像是一个代理分支.我通过切换到master分支解决了这个问题.

cd proj1
git checkout master
Run Code Online (Sandbox Code Playgroud)

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

如果我想让它始终与最新版本(HEAD)相关联,我该怎么办?

Von*_*onC 35

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 
Run Code Online (Sandbox Code Playgroud)

另请参阅Vogella关于子模块的教程.


原始答案(2011年12月)

添加的子模块将处于分离的HEAD模式

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

  • 如果签出提交SHA1(或标记),则处于分离的HEAD模式.
  • 如果你签出一个分支(就像你使用master子模块的分支一样),你可以在该分支的顶部创建其他提交(但你必须回到父仓库以便提交所述父代,因为你需要记录您创建的新子模块提交)

有关更多信息,请参阅" 子模块的真实性质 ".

如果您一直想要另一个repo的最新提交,最简单的方法是将它们合并在一起(例如使用子树合并).
有关详细信息和参考,请参阅" 合并2个相同的存储库GIT ".

  • @FateNuller是的,这是子模块的本质:它总是*分离的.您可以在.gitmodules文件中添加指令以指示它更新,但这不会改变父repo为该子模块记录SHA1的事实,并且任何后续克隆都将检出该SHA1上的子模块,已分离. (2认同)