一般认为
- 父项目 是当前正在做的主要工作,但需要依赖 子模块 中提供的算法或者工具。
- 父项目 与 子模块 不是同一批人维护的,或者是需要分开维护的。
此情此景,需要学习该教程了!!!
文章目录
- 1 如何在父项目添加子模块
- 2 提交推送父项目变更
- 3 更新父项目中的子模块
- 4 如何拉取包含子模块的父项目
- 5 在父项目修改并推送子模块 (待补充)
假设:
- 父项目仓库地址:https://gitee.com/gisleung/father_repo.git
- 子模块仓库地址:https://gitee.com/gisleung/son_repo.git
1 如何在父项目添加子模块
将父项目克隆至本地:
git clone https://gitee.com/gisleung/father_repo.git
然后进入父项目目录,添加子模块:
git submodule add https://gitee.com/gisleung/son_repo.git
此时父项目目录,多了两个文件夹:
- .gitmodules:记录当前仓库的子仓库信息
- son_repo:存放子仓库内容
进入子模块文件夹查看,发现已经将子仓库内容拉取下来:
当初次添加子模块完毕后,查看子模块的状态:
git submodule
首次添加子模块,git submodule 时,版本号 9019c 之前没有 + 或者- 号。但下面的教程中会有 + - 的出现,请仔细阅读哦
2 提交推送父项目变更
将已经添加子模块的父目录提交变更,并推送:
git status
git add .
git commit -m 添加子模块
git push
我们打开远程仓库看一下结果,发现已经将新变更推送成功。但并没有推动son_repo的内容,相当于只记录了son_repo的地址:
3 更新父项目中的子模块
假如你知道子模块的远程仓库已经有了最新提交:
那如何在父目录将子模块更新到最新版本呢,?
# 初始化版本
git submodule update --init
# 更新子模块为远程项目的最新版本
git submodule update --remote
此时,父目录中的子模块已经更新到最新:
马上查看一下子模块的状态:
git submodule
看到前面有个 + 号,表示子模块改变了,但是父项目没有将此次改变提交。此时应该马上 将父项目 git add .
、git commit -m 更新子模块
,然后再查看子模块的状态:
git submodule
发现 + 号已经没了。
此时,再将父项目推送至远端,那么别人拉取的时候,就会关联最新的子模块了
4 如何拉取包含子模块的父项目
此时父仓库已经有了子模块。删除本地后,重新把包含子模块的father_repo克隆一下:
方式一: 先克父仓库
git clone https://gitee.com/gisleung/father_repo.git
此时子模块的文件夹内是空的,查看子模块的状态:
git submodule
发现是个- 号。说明子模块还没有初始化。初始化子模块:
git submodule init
更新子模块:
git submodule update
完成之后,查看子模块的状态:
git submodule
此时,子模块的文件夹内就已经有最新(9019c版本)内容了。
这里版本号是 9019c ,是因为前面的版本 f5892 忘记 push
方式二: 递归克隆整个项目
git clone https://gitee.com/gisleung/father_repo.git --recursive
此时,先克隆父仓库,再克隆子模块。
ok!
5 在父项目修改并推送子模块 (待补充)
一般认为,不会在父项目中更改子模块哦
如果在父目录下,对子模块内容进行修改,会怎么样?
使用git status 查看父目录状态:
待补充
…
一些参考:
https://zhuanlan.zhihu.com/p/367089627
https://www.jianshu.com/p/9000cd49822c
https://blog.devtang.com/2013/05/08/git-submodule-issues/
https://blog.csdn.net/xqj2333/article/details/107826608