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的维护还是交给专职人员进行,做为集成者,只是用用就好!
参考
chrislzy: 如有疑惑,错误或者建议,请在评论区留下您宝贵的文字; 转载请注明作者和出处,未经允许请勿用于商业用途!