如何更新所有提交中的子模块 url

问题描述 投票:0回答:3

用例是我必须将某些存储库移动到新服务器。所以这些存储库会得到一个新的 url。
引用这些子模块的父项目需要使用子模块的新 url 进行更新。
我想到做以下事情。

  1. 更新 .gitmodules 文件
  2. git 子模块同步
  3. git 子模块更新
  4. 承诺并推动

但是,由于先前的提交具有早期版本的 .gitmodule,如果我签出父项目的先前提交 - 它不会查找旧服务器吗?


为了确保可重复性,我们需要让所有旧的提交都正常工作。 有什么办法可以解决这个问题吗?

git git-submodules
3个回答
11
投票

.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
不会更改。


0
投票

如果您需要这样做,唯一的方法是使用 filter-branch

但是要小心,因为在所有提交上更改

.gitmodules
意味着您要转换该提交。

如果您与许多开发人员共享 git 存储库,则所有开发人员都需要“强制拉取”新提交,并且所有工作基于旧提交需要重新调整到新分支。

有很多关于重写 git 历史的讨论。


0
投票

通常没有理由编译项目的旧版本(该版本引用具有旧的甚至不存在的 URL 的子模块)。但即使必须这样做,也可以始终创建一个源自该版本的新分支(提交),并向该新分支添加新的提交,从而更正 URL。

© www.soinside.com 2019 - 2024. All rights reserved.