使用场景
当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能(模块化–不同于组件化)
创建Submodule
举个栗子🌰,我们要创建一下结构的项目
mainProject //主工程
moduleA //子工程A
moduleB //子工程B
创建Git远程仓库
主工程和子工程都要分别创建各自的远程库
cd mainProject
git init
git add .
git commit -m "frist commit"
git remote add origin https://github.com/***/mainProject.git
git push -u origin main
如果已有远程库,就克隆下来
cd 空文件夹
git clong https://github.com/***/mainProject.git
引入submodule模块
cd mainProject
git submodule add https://github.com/***/moduleA.git moduleA
git add .
git commit -m "add submodule"
git push
--------------------------
cd mainProject
git submodule add https://github.com/***/moduleB.git moduleB
git add .
git commit -m "add submodule"
git push
使用
git status
可以看到多了两个需要提交的文件,其中.gitmodules
指定submodule的主要信息,包括子模块的路径和地址信息,moduleA
指定了子模块的commit id,使用git diff
可以看到这两项的内容。这里需要指出父项目的git并不会记录submodule的文件变动,它是按照commit id指定submodule的git header,所以.gitmodules
和moduleA
这两项是需要提交到父项目的远程仓库的。
On branch main
Your branch is up-to-date with 'origin/main'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: .gitmodules
new file: moduleA
使用Submodule
初始化
方法一,先clone父项目,再初始化submodule,最后更新submodule,初始化只需要做一次,之后每次只需要直接update就可以了,需要注意submodule默认是不在任何分支上的,它指向父项目存储的submodule commit id。
git clone https://github.com/***/mainProject.git mainProject
cd mainProject
git submodule init
git submodule update
方法二,采用递归参数–recursive,需要注意同样submodule默认是不在任何分支上的,它指向父项目存储的submodule commit id。
git clone https://github.com/***/mainProject.git mainProject --recursive
修改更新
cd mainProject/moduleA
git add .
git commit -m "change moduleA"
git push
//然后更新主工程的submodule commit id
cd mainProject
git status
git diff
git add .
git commit -m "update submoduleA"
git push origin main
删除
可以打开.gitmodules
文件,删除submodule相关的内容
[submodule "moduleA"]
url = /Users/*******/moduleA.git
然后提交到远程服务器
cd mainProject
git add .
git commit -m "remove submodule"
git push