Fork me on GitHub

git之submodule的使用

简介

当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能。

常用命令

git clone <repository> --recursive 递归的方式克隆整个项目
git submodule add <repository> <path> 添加子模块
git submodule init 初始化子模块
git submodule update 更新子模块
git submodule foreach git pull 拉取所有子模块

克隆含有子模块的仓库

方法一

采用递归参数"--recursive" clone

git clone git@https://github.com/repo/new_project.git --recursive

注:不要忘记--recursive子命令。

注: 主仓库对应的子仓库是对应于某次commit的, 而不是对应与某个分支, 因此需要切换分支.

切换子仓库的分支

cd sub_project
git checkout your_branch
git submodule update

方法二

先clone主仓库,再初始化submodule,最后更新submodule,初始化只需做一次。

git clone main_project.git
cd main_project/
git submodule init
git submodule update
cd sub_project
git checkout your_branch

添加子模块

git submodule add -b sub_branch git@https://github.com/repo/sub_project.git sub_path

注: 如果省略-b sub_branch子命令,则默认clone子模块的master分支

注: 如果省略sub_path,则默认clone到当前路径下,如果添加sub_path则注意路径末尾删掉/字符。

注: 如果是重新添加曾经添加过的子模块,需要加上-f选项。

删除子模块

git submodule deinit sub_project 
git rm -rf --cached sub_path/sub_project
rm -rf sub_path/sub_project
git add XXX
git commit -m "Remove sub_project"
git push

新建含有子模块仓库的新分支

建立含有submodule的git项目的新分支(需要切换子模块的分支)

方法一

直接删除主项目的上一个分支的对应的子模块,然后强制重新添加该子模块的另一个分支

git checkout -b new_branch
git submodule deinit sub_project 
git rm -rf --cached sub_path/sub_project
rm -rf sub_path/sub_project
git submodule add -f -b new_sub_branch git@https://github.com/repo/sub_project.git sub_path

方法二

转换相应子模块的分支

git config -f .gitmodules submodule.sub_project.branch new_sub_branch

注意,此时,方法一和二仅仅是在主项目中将子模块的分支记录改变了,实质上子模块的分支仍然没有改变(处于游离状态),需要进入子模块目录,然后:

cd sub_path
git checkout new_sub_branch

然后回到主项目目录下,进行通常的提交操作:

git add .
git status # 可选,但是在提交之前检查一下状态是一个好习惯
git commit -m "xxxxx"
git push -u origin new_branch

注:git submodule本质上是一个还不够完善和良好体验的功能,本意是为了分布式开发集成。对于submodule的使用,最好是只读,即仅仅是pull使用,不会进行维护和更改。虽然submodule也允许进行更改push操作,但是不建议使用,submodule的维护还是交给专职人员进行,做为集成者,只是用用就好!

参考

posted @ 2021-06-24 19:29  chrislzy  阅读(2028)  评论(0编辑  收藏  举报