git submodule 用于关联其他独立的仓库。
它有着几点好处:
- 代码复用:可以将工具代码放到单独的仓库,再通过 submodule 关联。
- 模块化开发:可以将项目拆分成多个模块,每个模块设置单独仓库独立开发,再通过 submodule 组合在一块。
- 版本控制:submodule 可以指定依赖的外部仓库的版本。确保项目使用的版本是稳定的。
git 关联子模块
- 添加子模块
git submodule add <仓库URL> <关联路径>
# git submodule add http://xxx.git packages/srm-front
执行成功后可以在父模块的.gitsubmodules
文件看到引入的子模块
- 在本地初始化子模块仓库,拉取子模块对应的分支代码
git submodule update --init --recursive --remote
git 修改子模块的URL
当关联的子模块地址改变后,在初始化子模块时会因为找不到对应的仓库而报错。这时需要修改子模块的地址。或者直接将子仓库 clone 到对应的目录下,但这样不方便团队协作
- 编辑
.gitmodules
文件
修改目标子模块的 URL 为新的 URL。
[submodule "packages/srm-front"]
path = packages/srm-front
url = http://xxxx.git
- 同步新的 URL 到 git 配置
运行以下命令将.gitmodules
的更改同步到本地仓库配置:
git submodule sync
- 清理子模块的现有配置和工作目录:
git submodule deinit --force my-submodule
- 重新初始化并更新子模块
使用新的 URL 重新初始化和检出子模块:
git submodule update --init --remote my-submodule
- 提交更改到主仓库
将修改后的.gitmodules
文件提交到版本控制:
git add .gitmodules
git commit -m "[refactor] 更新关联子模块地址"
git push
- 验证更改:
检查子模块远程 URL
进入子模块目录,确认远程URL是否已更新:
cd packages/srm-front
git remote -v # 应显示新的HTTP地址
注意事项:
- 如果子模块包含未提交的更改,
deinit
会提示错误,可先提交或丢弃这些更改。 - 若主仓库有多个子模块,使用
git submodule sync --recursive
同步所有嵌套子模块。 - 后续克隆主仓库时,使用
git clone --recurse-submodules
会自动使用新的HTTP URL
。 - 以上步骤确保子模块的 URL 在本地和后续克隆中均使用HTTP协议。