如何根据我克隆超级存储库的位置引用 git 子模块的备用 URL?

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

我有一个工作流程,我需要能够从一个 git 服务器 (server1) 中提取多个存储库并推送到另一个 git 服务器 (server2)。 server2 驻留在无法访问 Internet 的网络上,并且某些存储库使用引用驻留在 server1 上的其他存储库的子模块。

通常,当我递归克隆超级存储库(包含子模块的存储库)时,它会从原始源克隆子模块。但是,从 server2 克隆时,这不是一个选项,因为 server2 没有 Internet 访问权限。

我的想法是将子模块推送到 server2 上,并在从 server2 克隆超级仓库时克隆这些版本。我如何在保留能力的同时实现这一目标?

即,假设 server2 上的所有存储库与 server1 上的存储库相同,我希望以下 2 个命令是等效的,即使 server2 网络上的构建计算机无法到达 server1 来递归克隆子模块:

git克隆--recurse-submoduleshttps://server1/super-repo.git

git克隆--recurse-submoduleshttps://server2/super-repo.git (请记住,递归克隆子模块时,server2 无法到达 server1)

我正在考虑尝试通过分支机构来实现这一目标,但这似乎会带来维护问题。

git git-submodules
3个回答
1
投票

也许,就您的情况而言,值得尝试执行以下操作。 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 的更改,因为该文件受源代码控制。

另一种选择是拥有本地 git 服务器,它将通过本地网络供

server2
server1
使用。然后,它可以包含来自网络服务器的子模块的分支,但是
server1
server2
可以很好地从中获取子模块更新...


0
投票

我最终将子模块 URL 更改为相对 URL,并在我的开发计算机上修复了它。明天我将尝试在工作中部署此解决方案。

我遇到的一个缺点是,由于强制执行新的命名约定,子模块存储库在 server2 上具有不同的名称,这意味着 server1 上的相对名称与 server2 上的相对名称不匹配。我将通过重命名 server1 上的存储库来解决这个问题。


0
投票

一种选择是手动将子模块克隆到超级仓库工作树中的位置:

git clone .../alternate/path/submodule1/.git submodule1
git clone .../alternate/path/submodule2/.git submodule2

如果克隆目录中存在修订版本,

git submodule update
将看到该内容,并且不会尝试访问服务器。

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