Git 当 repo 中的子模块切换到具有其他树结构的不同 repo 时出错

Git errors out when a submodule in the repo is switched to a different repo with other tree structure

我有一个使用子模块 A 的 git 存储库,出于技术原因,我需要将子模块切换到子模块 B,这是一个具有不同提交的不同存储库,它们只共享几个从项目一开始就提交,这对我来说没问题。

到目前为止我所做的是:

  1. 修改.gitmodules文件以使用新的URL
  2. 删除repo中的子模块文件夹rm -rf .git/modules/<submodule>
  3. 删除工作目录下的子模块文件夹rm -rf <submodule>
  4. 运行 git submodule sync
  5. 运行 git submodule update

之后我得到一个错误:

fatal: remote error: upload-pack: not our ref a5129baec669f7736552019baccd3da7e5129cfd
Fetched in submodule path 'Submodule/path', but it did not contain a5129baec669f7736552019baccd3da7e5129cfd. Direct fetching of that commit failed.

因此带有 SHA a5129b 的提交作为最近的提交存在于子模块 A 中,但不在子模块 B 中。

我不明白为什么要从上一个子模块中获取提交,我是不是遗漏了什么?

我设法重现了这个问题并用这些命令修复了它:

git submodule set-url <submodule> <old url>
git submodule update
git submodule set-url <submodule> <new url>
git submodule update
git -C <submodule> fetch
git -C <submodule> reset --hard origin/HEAD

警告: 这将清除 submodule!

中任何未提交的更改