git submodule 管理子模块
直接添加一个submodule
git submodule add [URL] [SUBMODULE_NAME]
执行上面命令后,会在根目录会生成一个 .gitmodules
文件
[submodule "[SUBMODULE_NAME]"]
path = [SUBMODULE_PATH]
url = [URL]
用于描述对应的子模块仓库
位于 path 的子模块仓库的 .git
是个文件,内容 gitdir: ../.git/modules/xxx
指向主仓库里,所以统一在主仓库的 .git
文件夹管理git
在主模块使用 git status
会发现
Subproject commit 1801682bb79741d6fc61a7bf7e4af41f0589a157
,实际是 子仓库的git管理文件 gitdir: ../.git/modules/xxx/HEAD
指向了 1801682bb79741d6fc61a7bf7e4af41f0589a157
这个 ref 引用主仓库只负责管理本身仓库和使用 .gitmodules
引用子仓库
子仓库 从 .gitmodules
对应的 url 找到远程仓库,对应本地的源码路径 path
[submodule "子仓库"]
path = src/xx/xx
url = xxx.git
然后从上面 path 目录的 .git
文件指向主仓库的 .git
目录 主仓库/.git/modules/xxx
,接着从此目录的 HEAD
指向某个引用找到子仓库对应的源码
假设目前 git 管理了模块代码,切换到使用 git submodule 来管理
git rm -r --cached module_flutter
cd module_flutter
git init
git add .
git commit -m "New Module"
git remote add origin ssh://admin@192.168.1.211:29418/module_flutter.git
git push -u origin master # 推送到远端
把目录文件移除(或移动到别的地方)
在目录不存在的前提下,在主仓库根目录执行添加 git submodule 的命令
git submodule add ssh://admin@192.168.1.211:29418/module_flutter.git module_flutter
会生成 .submodule
文件,
git 会把子仓库 module_flutter 整个目录识别成文件,内容是子仓库的 HEAD 的 commitId
提交 .submodule
和 module_flutter
到远端即可
后续初始化更新子模块
git submodule update --init
之后可以进入 submodule 使用 git 操作
可直接拉取远端最新代码
可选择恢复原来目录的文件(可以恢复 build 目录等忽略的文件),
.git
文件和目录不要动,剪切移动除了 .git
外的文件恢复到原来目录