为 git 历史中的所有提交更改 git 子模块的远程存储库

Changing the remote repository of git submodule for all commits in git history

如何在不破坏提交历史的情况下更改 git 子模块的远程 url? 目前,如果我检查旧的提交,我的子模块似乎有旧的远程 url 不再存在。

我的工作流程:

  1. 使用提交 A、B 克隆 repo
  2. git 子模块更新 --init
  3. 更改子模块url
  4. 将 .git 模块推送到远程(提交 C)

  5. 使用提交 A、B、C 克隆 repo

  6. S 提交 A
  7. git 子模块更新 --init -> 失败

-> 还想要新的子模块远程 URL,但仍然是 .gitmodules

中的旧 url

似乎 git submodule update --init 仍在尝试使用旧遥控器 url

如果也尝试使用 git submodule update ,按照建议,但我也得到了错误:

The Git repository with name or identifier OLD_REPO_NAME does not exist or you do not have permissions for the operation you are attempting.

提交与远程无关。更改遥控器后,更改将对所有新旧提交生效。

要更改子模块的 URL,您需要:

  • 更改超级项目根目录中文件.gitmodules中的URL;
  • 运行 git submodule sync 将更改复制到 .git/config
  • cd进入子模块,运行git remote set-url改变子模块中的URL。

当您在超级项目中检出旧提交时,您会变老 .gitmodules 但这没关系 — git 不使用 .gitmodules 中的 URLs — 它使用 .git/config 中的 URLs。 git sync 将 URL 从 .gitmodules 复制到 .git/config。因此,在检查旧的 .gitmodules 旧提交后,不要 运行 git sync 并且 git 将继续使用 .git/config 中的新 URLs。

让我们尝试另一种方法。不要替换配置文件中的 URL,而是即时替换 URL:

git config --global url.<NEW-URL>.insteadOf <OLD-URL>

参见 git help config 关于 url.<base>.insteadOf