Git子模块允许你将一个Git仓库作为另一个仓库的子目录。
git submodule add <git-repo> [path]
一般来讲,我们会将子模块添加到path为thirdparty子目录下的某个位置
进行上述操作后,可以看到.gitmodules的配置信息已经得到了相应的更新:
[submodule "thirdparty/googletest"]
path = thirdparty/googletest
url = https://github.com/abseil/googletest
需要注意的是,当你不在子模块的目录时,git将不记录子模块的具体内容,而只是记录子模块的对应提交(HEAD/CommitSHA)
在子模块目录下的工作和正常git一致:
git checkout -b <branch-name>
edit file
git add
git commit
git push
如果在父项目的工作需要修改子模块,记得先提交子模块的改动,再提交父项目的改动。
否则,别人在你的两个父子提交之间拉取改动的时候,会得到父项目中指向子项目的指针已经更新,但是实际上对应子项目的改动并不在服务器上存在!
更新子模块
在子模块目录下,更新获得最新的头指针
git merge origin/master
在父目录,更新子目录的文件内容
git submodule update