TL;DR: 什么时候要用再看吧…也许现在你的兴趣并不大
把这篇文章里的命令打完,就能明白git submodule了 http://git-scm.com/book/en/Git-Tools-Submodules
Submodules are for things such as commonly reused libraries. It should be self-contained.
要点:
- submodule在添加或改动时,在主文件夹内commit,会产生特别的submodule型changeset.
- git submodule update负责把submodule的HEAD移动到最近的submodule型changeset里记录的SHA的节点
submodule的优势是没有copy & paste的不一致性。我理解的使用流程:
- 想要使用某库的时候,使用submodule add加入
- 众开发clone仓库,然后submodule init, submodule update,进入可用状态
- submodule有更新了,这是tech leader看了一眼,“不错,我们也可以更新”,于是在submodule文件夹里git pull,回到主项目文件夹中,git status发现submodule的HEAD发生变化了,于是commit下一个新的submodule型的changeset,然后push到中心仓库
- 众开发pull的时候发现submodule更新了(git pull后,git status会发现submodule文件夹出现了改变;git diff会发现submodule commit的SHA变化了)
- 众开发进入submodule文件夹,git pull。回到主项目文件夹内,git submodule update把submodule的HEAD放到正确的位置上。
FAQ:
-
要修改submodule里的代码怎么办? 如果你在本地修改了submodule,并且commit了,然后在主项目文件夹里commit。submodule的修改其他人是拿不到的。所以说,submodule一定是self-contained,要修改应该直接pull request给submodule的源(你当初添加submodule时它的remote)。 也只有这样,才能保持submodule的一致性。这正是submodule与copy & paste相比的优势啊!
-
在分支间切换时,可能一个分支有submodule,一个没有…这怎么办? http://git-scm.com/book/en/Git-Tools-Submodules#Issues-with-Submodules 很麻烦吧?所以不要这样做,好吧?