问题
有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。
也许是第三方库,或者你独立开发的,用于多个父项目的库。
现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。
方案
Git 通过子模块来解决这个问题。
子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。
它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。
使用子模块
-
添加子模块
$ git submodule add https://XXXX.com/XXXXX.git
添加子模块后运行git status, 可以看到目录有增加1个文件.gitmodules, 这个文件用来保存子模块的信息。
$ git status On branch master Initial commit Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: .gitmodules
-
查看子模块
$ git submodule
-
更新子模块
$ git submodule update
-
克隆包含子模块的项目
- 先clone项目, 后更新子模块
- clone 项目
$ git clone https://XXXX.com/XXXXXXX
- 子模块初始化
$ git submodule init Submodule 'XXXX' (https://XXXX.com/XXXXXX.git) registered for path 'XXXX'
- 子模块更新
$ git submodule update Cloning into 'assets'... remote: Counting objects: 151, done. remote: Compressing objects: 100% (80/80), done. remote: Total 151 (delta 18), reused 0 (delta 0), pack-reused 70 Receiving objects: 100% (151/151), 1.34 MiB | 569.00 KiB/s, done. Resolving deltas: 100% (36/36), done. Checking connectivity... done. Submodule path 'XXXX': checked out 'b37a657f184e243cb0db810a024ae79a5a92d07e'
- clone 项目
- 直接clone项目和子模块
git clone --recurse-submodules https://XXXX.com/XXXXXXX
- 先clone项目, 后更新子模块
-
修改子模块
在子模块中修改文件后,直接提交到远程分支。$ git add . $ git ci -m "commit" $ git push
-
删除子模块
删除子模块需要手动删除相关的文件,否则在添加子模块时有可能出现错误删除子模块文件夹
$ git rm --cached assets $ rm -rf assets
删除.gitmodules文件中相关子模块信息
[submodule “XXXX”]
path = XXXX
url = https://XXXX.com/XXXXXXXX.git
删除.git/config中的相关子模块信息
[submodule “XXXX”]
url = https://XXXX.com/XXXXXXXX.git
删除.git文件夹中的相关子模块文件$ rm -rf .git/modules/XXXX
参考链接
官网
https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97