如何根据我克隆超级仓库的位置为 git 子模块引用备用 URL?
How do I reference an alternate URL for a git submodule, depending on where I cloned the super-repo?
我有一个工作流程,我需要能够从一个 git 服务器(服务器 1)中提取多个回购协议并推送到另一个 git 服务器(服务器 2)。 server2 驻留在无法访问 Internet 的网络上,并且一些 repos 使用子模块引用驻留在 server1 上的其他 repos。
通常当我递归地克隆 super-repo(包含子模块的)时,它会从它们的原始源中克隆子模块。但是,从 server2 克隆时,这不是一个选项,因为 server2 没有 Internet 访问权限。
我的想法是将子模块推送到 server2 并在从 server2 克隆超级仓库时克隆这些版本。如何在保留能力的同时实现这一点?
也就是说,假设 server2 上的所有 repos 都与 server1 上的相同,我希望以下 2 个命令是等效的,即使 server2 网络上的构建机器无法到达 server1 以递归克隆子模块:
git clone --recurse-submodules https://server1/super-repo.git
git 克隆 --recurse-submodules https://server2/super-repo.git
(回想一下,当递归克隆子模块时,server2 无法到达 server1)
我正在考虑尝试通过分支来实现这一点,但这似乎会引入维护问题。
也许,在您的情况下,值得尝试执行以下操作。
Git 在以下位置存储有关子模块的信息:<root project folder>/.git/modules/<folder with name of your submodule>config
。
配置文件应该有部分
[remote "origin"]
url = <url to your submodule>
因此,也许您可以使用一些 bash 脚本,它将覆盖 server2
上的此设置,然后 - 关闭子模块。但是,如果必须改回来,那么下次从server1拉取后,不会有冲突。
此外,在项目的根文件夹中有 .gitmodules
文件,其中包含相同的 - 关于子模块的 url 信息。也许,只修改这个文件就足够了,然后在克隆过程中它会引用新的子模块url。但是,在这种情况下,修改此文件将被视为 git 的更改,b/c 此文件受源代码控制。
另一种选择是使用本地 git 服务器,server2
和 server1
可以通过本地网络使用。然后,它可以包含来自网络服务器的子模块的分支,但是 server1
和 server2
会很好地从中获取子模块更新...
我最终将我的子模块 URL 更改为相对 URL,并在我的开发机器上修复了它。我会在明天的工作中尝试部署此解决方案。
我遇到的一个缺点是,由于正在强制执行新的命名约定,子模块存储库在 server2 上具有不同的名称,这意味着 server1 上的相对名称与 server2 上的相对名称不匹配。我将通过重命名服务器 1 上的存储库来解决这个问题。
我有一个工作流程,我需要能够从一个 git 服务器(服务器 1)中提取多个回购协议并推送到另一个 git 服务器(服务器 2)。 server2 驻留在无法访问 Internet 的网络上,并且一些 repos 使用子模块引用驻留在 server1 上的其他 repos。
通常当我递归地克隆 super-repo(包含子模块的)时,它会从它们的原始源中克隆子模块。但是,从 server2 克隆时,这不是一个选项,因为 server2 没有 Internet 访问权限。
我的想法是将子模块推送到 server2 并在从 server2 克隆超级仓库时克隆这些版本。如何在保留能力的同时实现这一点?
也就是说,假设 server2 上的所有 repos 都与 server1 上的相同,我希望以下 2 个命令是等效的,即使 server2 网络上的构建机器无法到达 server1 以递归克隆子模块:
git clone --recurse-submodules https://server1/super-repo.git
git 克隆 --recurse-submodules https://server2/super-repo.git (回想一下,当递归克隆子模块时,server2 无法到达 server1)
我正在考虑尝试通过分支来实现这一点,但这似乎会引入维护问题。
也许,在您的情况下,值得尝试执行以下操作。
Git 在以下位置存储有关子模块的信息:<root project folder>/.git/modules/<folder with name of your submodule>config
。
配置文件应该有部分
[remote "origin"]
url = <url to your submodule>
因此,也许您可以使用一些 bash 脚本,它将覆盖 server2
上的此设置,然后 - 关闭子模块。但是,如果必须改回来,那么下次从server1拉取后,不会有冲突。
此外,在项目的根文件夹中有 .gitmodules
文件,其中包含相同的 - 关于子模块的 url 信息。也许,只修改这个文件就足够了,然后在克隆过程中它会引用新的子模块url。但是,在这种情况下,修改此文件将被视为 git 的更改,b/c 此文件受源代码控制。
另一种选择是使用本地 git 服务器,server2
和 server1
可以通过本地网络使用。然后,它可以包含来自网络服务器的子模块的分支,但是 server1
和 server2
会很好地从中获取子模块更新...
我最终将我的子模块 URL 更改为相对 URL,并在我的开发机器上修复了它。我会在明天的工作中尝试部署此解决方案。
我遇到的一个缺点是,由于正在强制执行新的命名约定,子模块存储库在 server2 上具有不同的名称,这意味着 server1 上的相对名称与 server2 上的相对名称不匹配。我将通过重命名服务器 1 上的存储库来解决这个问题。