用例是我必须将某些存储库移动到新服务器。所以这些存储库会得到一个新的 url。
引用这些子模块的父项目需要使用子模块的新 url 进行更新。
我想到做以下事情。
- 更新 .gitmodules 文件
- git 子模块同步
- git 子模块更新
- 承诺并推动
但是,由于先前的提交具有早期版本的 .gitmodule,如果我签出父项目的先前提交 - 它不会查找旧服务器吗?
为了确保可重复性,我们需要让所有旧的提交都正常工作。
有什么办法可以解决这个问题吗?
.gitmodules
中的URL通常仅在初始化子模块时或在git submodule sync
上使用。初始化时 (git submodule init
),URL 被放入存储库的 .git/config
,当子模块克隆到位时(在 git submodule update
),要使用的 URL 将从配置中获取。唯一一次使用 .gitmodules
中的 URL 是当您运行 git submodule sync
时,这将类似地更新配置中的 URL,但也会将子模块中的 origin
远程设置为相同的 URL。
这意味着您在签出较早的提交并运行
git submodule update
时不会遇到任何问题 - 当您在父存储库中签出新提交时,子模块中的远程 origin
不会更改。
如果您需要这样做,唯一的方法是使用 filter-branch。
但是要小心,因为在所有提交上更改
.gitmodules
意味着您要转换该提交。
如果您与许多开发人员共享 git 存储库,则所有开发人员都需要“强制拉取”新提交,并且所有工作基于旧提交需要重新调整到新分支。
有很多关于重写 git 历史的讨论。
通常没有理由编译项目的旧版本(该版本引用具有旧的甚至不存在的 URL 的子模块)。但即使必须这样做,也可以始终创建一个源自该版本的新分支(提交),并向该新分支添加新的提交,从而更正 URL。