跳转至

Submodule

在企业级项目开发中,对于较复杂的项目,不可避免地会引用一些公共基础库, 或是将代码拆解成公共模块和多个子模块进行管理,主项目工程中的子模块需要对公共 模块有依赖关系,却又不必关心公共模块内部的开发流程细节,若直接将公共代码复制到 项目中显然是不合适的,因为不方便更新维护 https://cloud.tencent.com/developer/article/1803958

创建submodule

git 工具的submodule其实是建立了当前项目与子模块间的依赖关系: 子模块路径、子模块远程仓库、子模块版本号。创建子模块:

git submodule add <submodule_url> <submodule_local_path>
此时,项目中会多出两个文件:.gitmodules 和子模块项目文件夹,git做了三件事 - 记录引用的仓库 - 记录主项目中 submodules 的目录位置 - 记录引用 submodule 的 commit id 提交后,在主项目仓库中,会显示出子模块文件夹,并附带其所在仓库的版本号,如:foo @ abcd1234

获取submodule

使用git submodule add命令会自动拉取子工程项目代码到指定目录,但其他开发者获取主项目代码时, 使用 git clone 命令是不会拉取到子项目的代码的,必须运行两条命令:

git submodule init # 初始化本地配置文件
git submodule update # 检出对应的 commit id 的子项目
也可以在 clone 命令中添加--recurse-submodules--recursive参数递归拉取子模块代码。
git clone --recursive /path/to/repos/foo.git

更新submodule

子项目通常由另外一个项目进行维护,通常不会在主项目中更改子项目内容

主项目更新了子项目的commit id

git submodule update
即可更新子项目到指定的commit id

主项目未更新子项目的commit id

需要在主项目中进入子项目执行

git pull
主动拉取代码,此时也会更新主项目中的子项目的commit id

删除submodule

git submodule deinit -f <submodule-name> # -f 参数将同时删除子模块工作区内的修改
rm -rf .git/modules/path/to/submodule
git rm -f --cached path/to/submodule
然后删除.gitmodules文件下的相关条目

submodule批量执行命令

若一个项目中有多个子模块需要执行相同的操作,每次切换到对应的目录挨个执行效率太低,此时可以使用git submodule foreach <command>\

git submodule foreach git checkout master
git submodule foreach git pull

评论