开发过程中经常会遇到依赖另外的项目,多数情况可能就是三方库,但是几个独立的项目,通过子模块可以将多个项目关联。
常用命令
通过子模块允许类库项目做一个库,子项目做为一个单独的 git 项目存在父项目中。
----- 添加submodule仓库
$ git submodule add <remote_url> <local_path>
$ git submodule add -b branch <remote_url> <local_path>
$ git submodule add git@your.gitlab.com:Project/nodus.git Specific/Subdir
----- 查看当前添加的子模块,第一个字符表示当前子模块状态,- 未更新 + 子模块被修改
$ git submodule
$ git submodule status
----- 查看相关配置信息
$ cat .gitmodules
$ cat .git/config
----- 对于clone一个有submodule的仓库,默认是不会把submodule也clone下来,需要执行如下步骤
----- 1. 注册submodule到.git/config里
$ git submodule init
----- 2. clone submodule
$ git submodule update --recursive
----- 上面两步等价于下面
$ git submodule update --init --recursive
----- 然后可以直接从submodule的库中拉取代码进行测试,也可以指定具体分支
$ git submodule foreach --recursive git fetch origin
$ git submodule add -b branch-name GIT-URL
配置文件
与子模块相关的关键有两个配置文件:A) .gitmodules
会随着代码提交保存在远程仓库中;B) .git/config
大部分操作时实际看起来保存的位置。可以通过 git submodule sync
将 .gitmodules
中的配置同步到 .git/config
文件中,默认是不会自动同步的。
所以,如果只需要修改远程仓库地址,那么可以直接编辑 .gitmodules
配置文件,然后在执行 git submodule sync
命令即可。
删除子模块
----- 逆初始化模块,会清理.gitmodules、.git/config、清空目录下的内容,目录需要手动删除
$ git submodule deinit -f module-name
----- 清理索引中的数据
$ git rm --cached {MOD_NAME}
另外需要查看 .gitmodules
、.git/config
中的相关信息。
常见问题
取消子模块保留代码
----- 清理索引中的数据
# git rm --cached YourModule
----- 清理配置文件
# vim .gitmodules
----- 也可以通过 git submodule sync 命令同步
# vim .git/config
----- 清理子模块引用
# rm YourModule/.git
常见问题
目录已经存在
报错为 'xxx' already exists and is not a valid git repo
信息,实际就是目录已经存在,可以直接删除目录后再添加,或者在 add
子命令后面添加 -f
参数。
没有子模块映射
完整的报错为 fatal: no submodule mapping found in .gitmodules for path 'XXX'
,这意味着在 .git/index
中缓存了,可以通过 git ls-files
查看,但是在 .gitmodules
中不存在。
可以通过 git rm --cached 'XXX'
命令将其删除。
索引已经存在
详细报错 'xxx' already exists in the index
,可以通过 git rm -r --cached xxx
删除本地缓存。