git子模块究竟是如何工作的

dac*_*ngy 22 git git-submodules

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

Von*_*onC 26

您的子模块表示为具有特殊模式的特殊条目(称为gitlink,请参阅" 带子模块的嵌套git存储库? "):(
请参阅" 通过git子模块提交检出 ")

new file mode 160000
index 0000000..4c4c5a2
Run Code Online (Sandbox Code Playgroud)

所以它不是检查"最新"版本,而是检查特定的SHA1,并且它是在DETACHED HEAD模式下执行的(请参阅" 如何使具有分离的子模块HEAD附加到实际HEAD ").

这并不意味着你无法更新子模块,正如我在" 子模块的真实性质 "中所解释的那样.

欲了解更多关于子模块,以及潜在为什么你可能希望使用他们(!),请阅读文章发人深省" 为什么你的公司不应该使用Git的子模块 ",从琥珀Yust(也对SO).

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

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

如果您随后在子模块中进行更改并提交,那么Git将很乐意创建提交...并让您仍然使用分离的HEAD.看看这是怎么回事?

假设您合并了一些恰好包含另一个子模块更新的更改.如果您尚未将自己的子模块更改提交到父项目中,Git将不会将子模块中的新提交视为冲突,如果您运行git submodule update它将很乐意在没有警告的情况下清除您的提交,将其替换为你刚刚合并的分支.

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

呃..."哎哟".


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