【问题标题】:How to make submodule with detached HEAD to be attached to actual HEAD?如何使带有分离 HEAD 的子模块附加到实际 HEAD?
【发布时间】:2012-01-28 09:13:35
【问题描述】:

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

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

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

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

cd proj1
git checkout master

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

如果我想让它始终链接到最新版本 (HEAD),我应该怎么做?

【问题讨论】:

标签: git git-submodules


【解决方案1】:

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's tutorial on submodules


原始答案(2011 年 12 月)

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

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

  • 如果您签出提交 SHA1(或标签),则您处于分离的 HEAD 模式。
  • 如果您签出一个分支(就像您对子模块的master 分支所做的那样),您可以在该分支之上创建其他提交(但您必须返回到父 repo 才能提交所述父同样,因为您需要记录您创建的新子模块提交)

请参阅“True nature of submodules”了解更多信息。

如果您一直想要另一个 repo 的最新提交,最简单的方法是将它们合并在一起(例如合并子树)。
有关详细信息和参考,请参阅“Merge 2 same repository GIT”。

【讨论】:

  • 请注意,git 子模块与 svn 外部模块非常不同。见stackoverflow.com/questions/3131912/…
  • 留个言以备后用。 subtree merge 不适合我,我认为 submodule 如果它支持良好的跟踪,那将是答案。
  • @Eonil 但它确实支持跟踪非常好,如果你也想要的话。简单来说,它的主要功能就是录制固定版本。
  • @FateNuller 是的,这就是子模块的本质:它是总是分离的。您可以在 .gitmodules 文件中添加一个指令来指示它进行更新,但这不会改变父 repo 为该子模块记录 SHA1 的事实,并且任何后续克隆都将签出该 SHA1 处的子模块,分离。跨度>
  • @VonC 是的,我只是希望有一个选项可以告诉 git 自动检查每个子模块的特定分支。
猜你喜欢
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多