Git子模块是如何工作的?

26

.gitmodule 文件仅指定模块存储库 url,git submodule 如何知道下载哪个版本?似乎总是检出最新版本。那么开发人员如何确保主项目与子模块之间的兼容性呢?

1个回答

32
你的子模块是以特殊模式表示的特殊条目(称为gitlink,请参见“Nested git repositories without submodules?”):
(请参见“Checkout past git submodule commit”)
new file mode 160000
index 0000000..4c4c5a2

所以它不会检查“LATEST”版本,而总是特定的SHA1版本,并且在DETACHED HEAD mode下执行此操作(参见“如何使子模块与实际 HEAD 相关联?”)。
这并不意味着您无法更新子模块,正如我在“子模块的真实本质”中所解释的那样。

如果想了解更多子模块的相关内容,以及为什么你可能不希望使用它们,请阅读来自Amber Yust(同样在SO上)的警醒文章“为什么你的公司不应该使用Git子模块”。

以下是一小段摘录,供大家娱乐(重点我加粗了):

当你调用git submodule update时,它会在父存储库中查找每个子模块的SHA,进入这些子模块,并检出相应的SHA。
正如在常规存储库中检出SHA的情况一样,这会将子模块置于分离的HEAD状态。
如果您在子模块中进行更改并提交,则Git将愉快地创建提交...并仍将您保留在分离的HEAD状态。您明白了吗?
假设您合并了一些更改,其中包括另一个子模块更新。如果您尚未将自己的子模块更改提交到父项目中,则Git不会将您的新提交视为冲突,如果您运行git submodule update,它将欣然在没有警告的情况下擦除您的提交,并用刚刚合并的分支中的提交替换它。 我希望您启用了子模块的reflog或仍然在终端滚动条中有旧的提交,否则,您刚刚失去了所有工作。 哎呀... “疼痛”。
请注意,现在子模块可以跟踪分支的最新版本:参见“git submodule tracking latest”。

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