首页/开发/Git 与协作速查/子模块 URL 变更与 sync
进阶与大仓实践69 条

子模块 URL 变更与 sync

.gitmodules 里的 URL 修改后,各克隆的本地配置仍指向旧地址;用 submodule sync 把新 URL 同步到 .git/config 与 .git/modules 配置。

Git 与协作速查开发更新于 2026-10-13

submodule sync 是什么

.gitmodules 里的 URL 修改后,各克隆的本地配置仍指向旧地址;git submodule sync 把新 URL 同步到 .git/config 与 .git/modules 下的子模块配置,让后续 update 走新地址。仓库迁移、切换镜像源、内外网双地址场景都靠它,忘记同步会导致子模块拉取仍然访问旧域名。

基本信息

语法git submodule sync [--recursive]
前提先更新 .gitmodules(或直接改配置)
配套git submodule update --init --recursive 重新拉取
作用点本地配置与子模块仓库缓存中的 URL 一起更新
核对git submodule foreach 'git remote -v' 查看子模块远端
注意不带 --recursive 时嵌套子模块不更新

典型使用场景

  • 仓库迁移:主仓库换域名后子模块 URL 一并同步
  • 镜像切换:内网镜像与公网地址切换,本地配置要跟上
  • CI 环境:缓存的工作区沿用旧 URL 时,同步后再拉取
  • 排错:子模块拉取报错域名不可达时先看同步状态
  • 审计脚本:批量检查各克隆的 URL 是否与新规范一致
  • 迁移演练:先在测试克隆完整跑通同步与重拉流程,确认无误再批量通知所有克隆者执行

常用示例

常用示例
# 修改 .gitmodules 后同步并重新拉取
git submodule sync --recursive
git submodule update --init --recursive
git submodule foreach 'git remote -v | head -1'   # 逐个核对子模块远端

不同步会怎样

现象原因处理
拉取仍走旧域名只改了 .gitmodules 没 syncsync 后用 update 重拉
新克隆一切正常新克隆直接读新配置老克隆逐个 sync
子模块内有本地改动子模块自己改过 remote单独核对,以父仓库配置为准
sync 以父仓库 .gitmodules 为准:子模块内部另行改过的 remote 会被覆盖,操作前先看清楚。
仓库迁移建议配套清单:同步 URL、清理旧账号凭据、通知所有克隆者执行 sync 与 update。
多层嵌套仓库要逐层确认:主仓库、子模块、子模块的子模块各有一份配置,同步时自顶向下逐层检查,任何一层漏掉都会在该层拉取时失败。

易错点

  • 只改不 sync:老克隆继续用缓存配置里的旧 URL,迁移后子模块全部拉取失败
  • 忘记递归:嵌套子模块不更新时漏掉更深层的 URL,迁移场景一律加 --recursive
  • 凭据残留:旧域名凭据还在配置里,迁移后应先清理再同步,避免请求打到旧服务
  • 子模块内自定义 remote:sync 会按父仓库覆盖,团队约定子模块 URL 统一由父仓库管理
  • 旧克隆漏同步:迁移通知发出后仍有人按旧地址克隆,定期用脚本抽查各克隆配置,发现旧 URL 及时提醒

数据来源与参考

  • Git 官方文档:git-submodule(sync)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌