FlynnZhou 2019-06-28
知道了git的大概工作的大概流程我们来实践一下git的基础操作
git submodule add 远程仓库地址
添加子模块git submodule init
初始化本地配置文件git submodule updata
拉取子模块数据git clone --recursive 远程仓库地址
克隆包含子模块的仓库(不用初始化)git rm 子模块
删除子模块git submodule foreach 操作命令
遍历子模块执行同样的命令来自官网有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。 也许是第三方库,或者你独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。这个时候我们就需要用到git
的子模块功能了。
说白了我们要做的就是在一个git
仓库中在克隆一个git
仓库做为它的子仓库
比如我们已经有一个test
仓库了,我们在该仓库中加入一个project
仓库来作为它的子模块,我们来test
仓库中执行git submodule add 远程仓库地址
git submodule add [email protected]:webxiaoma/project.git
执行完后我们会看到自我们的test
仓库中有了一个project
仓库,而且在根目录下多了一个.gitmodules
文件,这个文件中记录着我们子仓库的信息
[submodule "project"] path = project url = [email protected]:webxiaoma/project.git
并且我们现在可以进入我们的版本库.git
目录来看一下,该目录中会多出一个modules
文件夹,该文件夹中保存了我们project
仓库的一些配置信息和版本,他就是我们子仓库的版本库,在我们的config
配置文件中也多出了一个submodule
模块来记录我们子仓库的远程地址
// 上省略 [submodule "project"] url = [email protected]:webxiaoma/project.git active = true
另外对子模块project
的git操作和平常命令一样,我们只要在子模块中去执行就可以。
这里为了操作克隆含有子模块的仓库,我们将我们上面test
仓库提交并推送到远程,之后我们删除本地test
仓库,然后我们来克隆它,这里将带有子模块的仓库克隆下来并初始化有两种方法:
第一种方法
git clone [email protected]:webxiaoma/test.git
克隆下来后我们进入子模块project
目录中,会发现该目录是空的,我们需要初始化子模块。
// 初始化本地配置文件 git submodule init // 则从该项目中抓取所有数据并检出父项目中列出的合适的提交 git submodule updata
第二种方法
这种方法克隆下拉的仓库它的子仓库就已经初始化好了
git clone --recursive [email protected]: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'