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

时间:2018-10-30 18:36:28

标签: git git-submodules

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

通常,当我递归克隆超级仓库(一个包含子模块的仓库)时,它会从其原始源中克隆子模块。但是,从server2克隆时这不是一个选择,因为server2无法访问Internet。

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

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

git clone --recurse-submodules https://server1/super-repo.git

git clone --recurse-submodules https://server2/super-repo.git (并记得递归克隆子模块时,server2无法到达server1)

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

2 个答案:

答案 0 :(得分:1)

也许,就您而言,值得尝试执行以下操作。 Git在以下位置存储有关子模块的信息:<root project folder>/.git/modules/<folder with name of your submodule>config。 配置文件应包含“

”部分
[remote "origin"]
url = <url to your submodule>

因此,也许您可​​以使用一些bash脚本,它将覆盖server2上的此设置,然后关闭close子模块。但是,如果必须将其改回来,那么在从server1下一次拉出之后,就不会有冲突。

此外,项目的根文件夹中还有.gitmodules文件,其中包含相同的文件-有关子模块URL的信息。也许仅仅修改该文件就足够了,然后在克隆过程中它将引用新的子模块url。但是,在这种情况下,对该文件的修改将被视为git的更改,因为该文件在源代码控制下。

另一种选择是拥有本地git服务器,它将通过本地网络用于server2server1。然后,它可以包含来自网络服务器的子模块的分支,但是server1server2会很好地从中获取子模块的更新...

答案 1 :(得分:0)

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

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