Git 子模块使用¶
概要: 简介 git submodule 的使用方法
创建时间: 2022.10.09 23:12:04
更新时间: 2023.08.16 22:26:10
在现有主库中添加子模块¶
添加子模块repo-a
到主库
Bash | |
---|---|
.gitmodules
提交此变更到主库,无需使用git add
命令
Bash | |
---|---|
重新拉取主库的两种方式¶
拉取时不初始化子模块¶
Bash | |
---|---|
提示
- 初始化和拉取子模块的命令可以合并为:
git submodule update --init
- 如果需要初始化并拉取全部任意深度嵌套子模块,命令为:
git submodule update --init --recursive
拉取时初始化子模块¶
如果给 git clone
命令传递 --recurse-submodules
选项,它就会自动初始化并更新仓库中的每一个子模块, 包括可能存在的嵌套子模块
Bash | |
---|---|
主库操作¶
更新子模块¶
Bash | |
---|---|
主库推送时检查子模块是否有更改¶
Bash | |
---|---|
主库推送时一并尝试推送子模块的更改¶
Bash | |
---|---|
警告
使用上述命令时,如果子模块推送失败,则本次推送失败,不会有任何改动推入主库或其它子模块
子模块相关配置¶
配置使用的子模块分支¶
Bash | |
---|---|
配置主库推送时检查子模块的更改¶
Bash | |
---|---|
同时在主库和子模块上改动并提交¶
提示
当我们运行 git submodule update
从子模块仓库中抓取修改时, Git 将会获得这些改动并更新子目录中的文件,但是会将子仓库留在一个称作“游离的 HEAD”的状态。 这意味着没有本地工作分支(例如 “master” )跟踪改动。 如果没有工作分支跟踪更改,也就意味着即便你将更改提交到了子模块,这些更改也很可能会在下次运行 git submodule update
时丢失。
同时对子模块进行修改和更新需要做如下事情
- 进入子模块目录并检出对应分支
- 在主库上,使用
git submodule update --remote --merge
参数将子模块分支更新 - 本地对子模块进行修改并提交commit
- 在主库上,使用
git submodule update --remote --rebase
参数将子模块分支更新 - 一并推送主库和子模块提交到远端
git push --recurse-submodules=on-demand
Bash
提示
上述第2步和第4步类似于普通仓库的修改代码前git pull
一把,然后在推送到远端前,再git pull
一把避免本地与远端冲突
所有子模块执行相同命令¶
使用 foreach
关键字
Bash | |
---|---|
添加和主库子目录同名的子模块¶
警告
不能使用rm -rf CryptoLibrary/ && git submodule add xxx
命令,因为没有从git中取消暂存主库的子目录