【问题标题】:how exactly does git submodule workgit submodule 究竟是如何工作的
【发布时间】:2012-08-18 04:27:49
【问题描述】:

.gitmodule 文件仅指定模块存储库 url。 git submodule 怎么知道要下载哪个版本?它似乎总是在检查最新版本。那么,开发者如何保证主项目与子模块的兼容性呢?

【问题讨论】:

    标签: git git-submodules


    【解决方案1】:

    您的子模块表示为具有特殊模式的特殊条目(称为 gitlink,请参阅“Nested git repositories without submodules?”):
    (见“Checkout past git submodule commit”)

    new file mode 160000
    index 0000000..4c4c5a2
    

    因此,它不会检查“最新”版本,而是始终检查特定的 SHA1,并且在 DETACHED HEAD mode 中进行检查(请参阅“How to make submodule with detached HEAD to be attached to actual HEAD?”。

    这并不意味着您不能更新子模块,正如我在“true nature of submodules”中解释的那样。

    有关子模块的更多信息,以及您可能想要使用它们的原因(!),请阅读发人深省的文章“Why your company shouldn’t use Git submodules”,来自Amber Yust(也是on SO) .

    只有一小段摘录,用于踢球和咯咯笑(强调我的):

    当您调用 git submodule update 时,它会在父存储库中查找每个子模块的 SHA,进入这些子模块,并检出相应的 SHA。
    如果您在常规存储库中签出 SHA,就会出现这种情况,这会将子模块置于分离的 HEAD 状态。

    如果您随后在子模块中进行更改并提交,Git 将愉快地创建提交……并让您仍然拥有一个分离的 HEAD。看看这是怎么回事?

    假设您合并了一些恰好包含另一个子模块更新的更改。如果您尚未将自己的子模块更改提交到父项目中,Git 不会将您在子模块中的新提交视为冲突,并且 如果您运行 git submodule update 它会很高兴地清除您的提交而不会发出警告, 用你刚刚合并的分支替换它

    我希望您启用了子模块的 reflog 或在终端回滚中仍然保留旧提交,因为否则,您将丢失所做的所有工作

    呃……“哎哟”。


    请注意,现在子模块可以跟踪分支中的最新消息:请参阅“git submodule tracking latest”。

    【讨论】:

      猜你喜欢
      • 2014-11-20
      • 2011-06-26
      • 2021-08-15
      • 2012-06-08
      • 2011-10-11
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      相关资源
      最近更新 更多