有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。 也许是第三方库,或者你独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个,或者有多个项目公用同一个。

我们可以通过Git 通过子模块来解决这个问题。 子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。

1. clone 含有子模块的项目

     git clone --recurse-submodules https://github.com/xxxxxxx  

     它就会自动初始化并更新仓库中的每一个子模块, 包括可能存在的嵌套子模块。


   如果你已经克隆了项目但忘记了 --recuerse-submodules,那么可以运行。

   git submodule update --init     将 git submodule initgit submodule update 合并成一步。

   如果还要初始化、抓取并检出任何嵌套的子模块, 请使用简明的:

   git submodule update --init --recuerse

 先解释一下:

项目中依赖子模块版本(或者叫节点)的更新,与子模块的更新是不一样的,区别是:子模块更新了,主项目中pull 是不会有任何子模块代码更新提示的,但是如果子模块更新了,并且主项目依赖子模块的版本或者叫节点更新了,这时候pull,就会提示你子模块有更新。

android 子模块中引用主工程的风味的例子 如何调用子模块_git

 这个 base-custom 就是在主项目中的一个子模块,@6e0dab1 就是主项目依赖子模块的一个版本(叫节点也行),同是这个 @6e0dab1 也是子模块中的 commit Id

2.将本地的子模块更新到最新版本(也可以理解成:将主项目的依赖的子模块的版本更新到最新

如果子模块有内容更新,但是你主项目依赖子模块的版本号没有更新,你在主项目 git pull 的时候,不会提示你子模块有更新,更不会更新子模块的内容 。

如果你需要将主项目依赖子模块的版本号更新:也就是将本地子模块更新到最新版本

你可以在主项目的目录下执行:

git submodule update --remote   拉取远程子模块最新版本

android 子模块中引用主工程的风味的例子 如何调用子模块_新版本_02

执行完上述命令后,你的本地已经拉取到最新的子模块的版本了,本地子模块的代码也是最新的


git status 

android 子模块中引用主工程的风味的例子 如何调用子模块_github_03

 这时候,如果你确定你要将子模块的代码更新到最新,你可以按部就班的执行 add,commit,push操作,之后,远程仓库就会更新依赖子模块的commit id为你提交的最新的 

但是,如果这个时候,你又不想更新子模块了,你可以执行


git submodule update 

android 子模块中引用主工程的风味的例子 如何调用子模块_版本号_04

这里就会提示你已经checked 到 你执行 git submodule update --remote 之前的那个版本 


git status 看一下

android 子模块中引用主工程的风味的例子 如何调用子模块_新版本_05

  很干净。

3. 拉取别人更新好的 主项目依赖子项目的最新版本

这个是指,子模块内容有更新,并且主项目远程已经更新到最新的子项目依赖版本,也就是你本地子模块依赖节点(版本)和远程的子模块不一致,这时候你需要更新到最新。


一般我们在写好代码,push之前,都需要先pull,远程拉取一下,这时候如果远程子模块依赖节点有更新,如:

android 子模块中引用主工程的风味的例子 如何调用子模块_github_06

但是此时 一定要注意:这种状态它并没有帮你更新子模块,只是帮你更新了主模块依赖子模块的节点,你可以看看自己的子模块的代码还是旧的。


git status 看看(这种情况不要去add, commit ,push,因为你还是老版本的子模块,提交了会覆盖别人更新的新版本的子模块)

android 子模块中引用主工程的风味的例子 如何调用子模块_版本号_07


然后你可以执行  git submodule update (更新子模块的内容) 。

android 子模块中引用主工程的风味的例子 如何调用子模块_新版本_08

执行完成后,这时候才更新了最新子模块的代码。


git status 看看 


 

android 子模块中引用主工程的风味的例子 如何调用子模块_github_09

 子模块已经更新到了最新的,状态也很干净!