Git子模块迁移URL后工作分支拉取旧地址问题及流程咨询
问题原因
执行子模块拉取时读到旧URL,核心原因是Git子模块的URL配置存在两层存储:
- 提交在仓库里的
.gitmodules文件:随分支代码一起版本管理,不同分支可以存储不同配置 - 本地仓库
.git/config文件:本地缓存的子模块配置,切换分支时不会自动同步.gitmodules的最新改动
切到工作分支后直接执行git submodule update,Git读取的是本地缓存的master分支旧URL,自然会拉取错误。
不需要合并到master的正确拉取方式
在原有操作流程里加一步同步子模块配置即可,完整命令如下:
git clone myRepo.git git checkout myWorkingBranch # 同步当前分支.gitmodules里的最新配置到本地缓存 git submodule sync --recursive git submodule update --init --recursive
如果你之前已经跑过错误的update拉到了旧地址的子模块,先执行下面的命令清理错误状态,再走上面的流程即可:
git submodule deinit --all -f
不需要手动进入每个子模块目录切分支,也不需要提前把工作分支合并到master。
子模块URL迁移的规范流程
只修改.gitmodules就提交的流程不完整,标准迁移流程如下:
- 修改根目录下
.gitmodules文件中对应子模块的URL为新地址 - 执行
git submodule sync --recursive,将新URL同步到本地配置缓存 - 进入子模块目录,确认拉取到的内容符合预期,切到你需要绑定的对应提交/分支
- 回到主仓库根目录,执行
git add .gitmodules <子模块目录路径>,将.gitmodules的URL变更、子模块指针的变更同时加入暂存区 - 提交改动,推送到对应远程分支即可
注意:不要直接修改本地
.git/config里的子模块地址,这个文件属于本地配置,不会被提交到远程仓库,仅修改该文件不会对其他协作者生效。
内容的提问来源于stack exchange,提问作者init
相关产品推荐
相关产品推荐

