知道了git的大概工做的大概流程咱们来实践一下git的基础操做html
git submodule add 远程仓库地址
添加子模块git submodule init
初始化本地配置文件git submodule updata
拉取子模块数据git clone --recursive 远程仓库地址
克隆包含子模块的仓库(不用初始化)git rm 子模块
删除子模块git submodule foreach 操做命令
遍历子模块执行一样的命令来自官网有种状况咱们常常会遇到:某个工做中的项目须要包含并使用另外一个项目。 也许是第三方库,或者你独立开发的,用于多个父项目的库。 如今问题来了:你想要把它们当作两个独立的项目,同时又想在一个项目中使用另外一个。这个时候咱们就须要用到git
的子模块功能了。git
说白了咱们要作的就是在一个git
仓库中在克隆一个git
仓库作为它的子仓库github
好比咱们已经有一个test
仓库了,咱们在该仓库中加入一个project
仓库来做为它的子模块,咱们来test
仓库中执行git submodule add 远程仓库地址
web
git submodule add git@github.com:webxiaoma/project.git
执行完后咱们会看到自咱们的test
仓库中有了一个project
仓库,并且在根目录下多了一个.gitmodules
文件,这个文件中记录着咱们子仓库的信息less
[submodule "project"] path = project url = git@github.com:webxiaoma/project.git
而且咱们如今能够进入咱们的版本库.git
目录来看一下,该目录中会多出一个modules
文件夹,该文件夹中保存了咱们project
仓库的一些配置信息和版本,他就是咱们子仓库的版本库,在咱们的config
配置文件中也多出了一个submodule
模块来记录咱们子仓库的远程地址url
// 上省略 [submodule "project"] url = git@github.com:webxiaoma/project.git active = true
另外对子模块project
的git操做和日常命令同样,咱们只要在子模块中去执行就能够。code
这里为了操做克隆含有子模块的仓库,咱们将咱们上面test
仓库提交并推送到远程,以后咱们删除本地test
仓库,而后咱们来克隆它,这里将带有子模块的仓库克隆下来并初始化有两种方法:htm
第一种方法开发
git clone git@github.com:webxiaoma/test.git
克隆下来后咱们进入子模块project
目录中,会发现该目录是空的,咱们须要初始化子模块。rem
// 初始化本地配置文件 git submodule init // 则从该项目中抓取全部数据并检出父项目中列出的合适的提交 git submodule updata
第二种方法
这种方法克隆下拉的仓库它的子仓库就已经初始化好了
git clone --recursive git@github.com:webxiaoma/test.git
推送子模块咱们能够直接在子模块中执行git push
,若是提示你执行 git push origin HEAD:<远程分支名>
, 你查看一下你是否处于子模块的master
分支,若是不是切换到master
分支去推送,推送完成后咱们再去推送咱们的父模块。
咱们更新子模块有两种方法。第一种方法咱们在子模块目录直接使用git pull
;
第二种方法是使用git submodule update --remote 子仓库名
git submodule update --remote project
删除子模块咱们可使用
git rm project
这样删除的子模块其实只是把咱们子模块的文件夹删除了,并无将子模块的信息删完全,咱们还要进入.git/module
目录中将project
目录删除(这个目录对应的是子模块的的目录,若是你的模块叫lesson
,那么就在.git/module
目录中删除对应的lesson
目录)。
若是主仓库中含有不少的子模块,咱们在推送主仓库时须要先推送每个子模块,这样操做很麻烦,咱们可使用git submodule foreach 命令
,foreach
能够遍历全部子模块并执行咱们要执行的命令。例如咱们推送全部子模块
git submodule foreach 'git pull'