当项目变得越来越大,就会想到分成多个子模块,我们希望各个子模块都是独立的项目进行版本管理和维护,这时候我们就会用到git的submodule功能。
-
使用场景:某个工作中的项目需要包含并使用另一个项目;
-
说白了就是把两个独立的项目,在其中一个项目中使用另一个项目。
-
Git 通过子模块来解决这个问题。 子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。
一、子模块的导入方法:
// 将项目B添加到项目A中
1. 用命令切换到A项目的根目录
2. 添加子项目B到项目A的文件夹C中
$ git submodule add https://github.com/ccc/Demo C
3. 添加子模块后运行git status, 可以看到目录有增加1个文件.gitmodules
$ git status
4. 查看子模块
$ git submodule
5. 更新子模块:
更新项目内子模块到最新版本:
$ git submodule update
更新子模块为远程项目的最新版本:
$ git submodule update --remote
二、修改子模块的功能
- 在子模块中修改文件后,直接提交到远程项目分支
$ git add .
$ git ci -m "commit"
$ git push origin HEAD:master
三、修改子模块的路径
// 命令行修改
1. 修改'.gitmodules'文件中对应模块的”url“属性
$ open .gitmodules
2. 打开.git/config
$ open .git/config
3. 使用git submodule sync命令,将新的URL更新到文件.git/config
$ git submodule sync
4. 提交变更
$ git commit -am "Update submodule url."
// 如果没有修改成功就手动修改
1. 先修改完".gitmodule"文件:打开.gitmodules进行修改项目路径
$ open .gitmodules
2. 再手动修改.git/config:打开.git/config进行修改项目路径
$ open .git/config
四、删除子模块
// 方法一:
# 逆初始化模块,其中{MOD_NAME}为模块目录,执行后可发现模块目录被清空
git submodule deinit {MOD_NAME}
# 删除.gitmodules中记录的模块信息(--cached选项清除.git/modules中的缓存)
git rm --cached {MOD_NAME}
# 提交更改到代码库,可观察到'.gitmodules'内容发生变更
git commit -am "Remove a submodule."
// 方法二: 以删除C文件夹为例
删除子模块文件夹
$ git rm --cached C
$ rm -rf C
删除.git文件夹中的相关子模块文件
$ rm -rf .git/modules/C
打开.gitmodules文件
$ open .gitmodules
删除.gitmodules文件中相关子模块信息
打开.git/config文件
$ open .git/config
删除.git/config中的相关子模块信息
五、克隆包含子模块的项目
- 克隆包含子模块的项目有两种方法:
1⃣️种是先克隆父项目,再更新子模块;
1. 克隆父项目project_A到文件夹C
$ git clone https://github.com/ccc/project_A.git C
2. 查看子模块
$ git submodule
输出:-a21bc3af61ba413028a9f6ac41633614102a2f14 C (heads/master)
// 子模块前面有一个减号 -,说明子模块文件还未检入(空文件夹)
此时需要初始化子模块
$ git submodule init
3. 更新子模块
$ git submodule update
2⃣️直接递归克隆整个项目
git clone hhttps://github.com/ccc/project_A.git C --recursive
网友评论