git submodules

自己的版本库中常常引用一些开源的基础模块,比如googletest、glog,比较笨的做法是clone一份代码,直接再提交到自己的版本库中。更推荐的做法是使用git submodules。

当然,通常不会引用这些基础模块的最新版本,一有稳定性的考虑,二也有兼容性的考虑,所以再添加submodule的时候需要指定分支或Tag。以我的libgooglepinyin为例。

  • 在项目的根目录下添加submodule,它会在根目录下创建文件.gitmodules

    1
    $ git submodule add https://github.com/google/googletest.git googletest
  • 将模块检出到指定版本:

    1
    2
    $ cd googletest
    $ git checkout release-1.8.0
  • 提交

    1
    2
    3
    $ cd ..
    $ git commit -m"commit changes"
    $ git push

下次再执行git clone主项目之后,再更新module:

1
$ git submodule update --init --recursive

将直接将指定tag的submodule更新下来。不过我没找到这个tag是记录在本地哪个配置文件中。
在新的目录下执行clone验证一下:

1
2
3
4
$ git clone https://github.com/palanceli/libgooglepinyin.git
$ cd libgooglepinyin/googletest
$ git describe --tags
release-1.8.0

删除某个submodule,需要1、在.gitmodules中删除相关字段;2、在.git/config中删除相关字段;3、删除模块的文件夹。