git子模块的工作方式

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

你的子模块被表示为特殊模式的特殊条目(称为gitlink ,请参阅“ 无子模块的嵌套git存储库? ”):
(请参阅“ 签出过去的git子模块提交 ”)

 new file mode 160000 index 0000000..4c4c5a2 

因此,它不检出“最新”版本,而是始终是一个特定的SHA1,并在“ 分离头”模式下执行此操作 (请参阅“ 如何使分离的HEAD连接到实际的HEAD ? ”的子模块 。

这并不意味着你不能更新子模块,正如我在“ 子模块的真实性质 ”中解释的那样。

有关子模块的更多信息,以及潜在您为什么不想使用它们(!)的信息,请阅读Amber Yust (同样适用于SO )的清醒文章“ 为什么您的公司不应该使用Git子模块 ”。

只是一个小的提取物,踢和咯咯(强调我的):

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

如果你然后在子模块中进行更改并提交,那么Git会高兴地创build提交…并让你仍然使用分离的HEAD。 看看这是怎么回事?

假设你合并了一些更多的包含另一个子模块更新的更改。 如果你还没有将自己的子模块更改到父项目中,Git将不会将你在子模块中的新提交视为冲突,并且如果你运行git submodule update它将会愉快地擦除你的提交而不发出警告,replace它与你刚刚合并的分支

我希望你已经启用了你的子模块的reflog或者在你的terminal回滚中仍然有旧的提交, 否则你就失去了你所做的所有工作

呃……“哎呀”。


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