使用前提
经常碰到这种情况:当你在一个 Git 项目上工作时,你需要在其中使用另外一个 Git 项目。也许它是一个第三方开发的 Git 库或者是你独立开发和并在多个父项目中使用的。这个情况下一个常见的问题产生了:你想将两个项目单独处理但是又需要在其中一个中使用另外一个。
在 Git
中你可以用子模块submodule
来管理这些项目,submodule
允许你将一个
Git 仓库当作另外一个 Git
仓库的子目录。这允许你克隆另外一个仓库到你的项目中并且保持你的提交相对独立。
添加子模块
添加子模块命令?
此文中统一将远程项目git@gitee.com:qiaogaojian/framework.git
克隆到本地Framework
文件夹。
1 | $ git submodule add git@gitee.com:qiaogaojian/framework.git Framework |
添加子模块后运行git status
, 可以看到目录有增加 1
个文件.gitmodules
, 这个文件用来保存子模块的信息。
1 | $ git status |
查看子模块
查看子模块命令?
1 | $ git submodule |
更新子模块
更新项目内子模块到最新版本命令?
1
$ git submodule update
更新子模块为远程项目的最新版本
1
$ git submodule update --remote
克隆包含子模块的项目
克隆包含子模块的项目有二种方法:一种是先克隆父项目,再更新子模块;另一种是直接递归克隆整个项目。
克隆父项目,再更新子模块
- 克隆父项目
1 | $ git clone https://github.com/maonx/vimwiki-assets.git assets |
- 查看子模块
1 | $ git submodule |
子模块前面有一个-
,说明子模块文件还未检入(空文件夹)。
- 初始化子模块
1 | $ git submodule init |
初始化模块只需在克隆父项目后运行一次。
- 更新子模块
1 | $ git submodule update |
递归克隆整个项目
clone 带子模块的项目?
1 | git clone https://github.com/maonx/vimwiki-assets.git assets --recursive |
递归克隆整个项目,子模块已经同时更新了,一步到位。
修改子模块
在子模块中修改文件后,直接提交到远程项目分支。
1 | $ git add . |
删除子模块
怎么删除子模块?
删除子模块比较麻烦,需要手动删除相关的文件,否则在添加子模块时有可能出现错误
同样以删除assets
文件夹为例 . 1. 删除子模块文件夹
1 | $ git rm --cached assets |
.gitmodules
文件中相关子模块信息
1 | [submodule "assets"] |
.git/config
中的相关子模块信息
1 | [submodule "assets"] |
.git
文件夹中的相关子模块文件
1 | $ rm -rf .git/modules/assets |
更换子模块
- 先删除
- 再添加
Backlinks:
- Git submodule 子模块的管理和使用