简介
某个git项目需要使用第三方库git项目,你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。Git 通过子模块来解决这个问题,子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。
添加子模块
格式:git submodule add [subrepo] [path]
举例:git submodule add https://github.com/google/uuid.git ./library/uuid
subrepo: 要引用的第三方库git路径
path: 第三方库代码放在本地的路径,也是添加后模块名称
添加完成后,项目下新增了一个“./library/uuid”文件夹,并且会出现一个“.gitmodules”的文件,里面记录了子模块相关信息,如下
[submodule "library/uuid"]
path = library/uuid
url = https://github.com/google/uuid.git
设置子模块分支
格式:git config -f .gitmodules submodule.[mod_name].branch [branch_name]
举例:git config -f .gitmodules submodule.library/uuid.branch v1.1.1
mod_name: 模块名称,“添加子模块”时指定的名称
branch_name: 第三方git库的分支名称
设置完成后,“.gitmodules”文件信息如下
[submodule "library/uuid"]
path = library/uuid
url = https://github.com/google/uuid.git
branch = v1.1.1
注意:
“./library/uuid”中文件并没有同步到v1.1.1分支,请查看接下来的内容
向下同步子模块
命令:git submodule update --remote
当指定子模块代码修改后或重新指定了子模块分支后,使用该命令来同步子模块代码
向上更新子模块
$ cd [submodule_folder] # 进入子模块目录
$ git checkout branch_name # 切换到需要的分支
$ 修改子模代码
$ git commit -m ‘update submodule’
$ git push origin branch_name # 更新子模块
先进入子模块,然后切换到需要的分支,然后对子模块pull
检出含子模块的项目
step1:git clone [subrepo url]
step2:git submodule init
step3:git submodule update
若git检出的项目中引用了其他git项目,则使用以上命令来检出子模块代码,也可以使用以下命令一步到位
git clone --recursive [subrepo url]
删除子模块
删除子模块较复杂,步骤如下:
step1:删除子模块文件夹
$ git rm --cached library/uuid
$ rm -rf ./library/uuid
step2:删除.gitmodules文件中相关子模块信息
[submodule “library/uuid”]
path = library/uuid
url = https://github.com/google/uuid.git
step3:删除.git/config中的相关子模块信息
[submodule “library/uuid”]
url = https://github.com/google/uuid.git
step4:删除.git文件夹中的相关子模块文件
$ rm -rf .git/modules/library/uuid
注意事项
1.修改子模块的配置后,一定记住要使用git commit
推送代码保存配置
2.运行 git diff -p --submodule,可以查看到子模块的修改