我有一个工作流,我需要能够从一个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)
我当时正在考虑尝试通过分支机构实现这一目标,但这似乎会带来维护问题。
答案 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服务器,它将通过本地网络用于server2
和server1
。然后,它可以包含来自网络服务器的子模块的分支,但是server1
和server2
会很好地从中获取子模块的更新...
答案 1 :(得分:0)
最终,我将子模块URL更改为相对URL,并在我的开发机器上对其进行了修复。我明天尝试在工作中部署此解决方案。
我遇到的一个缺点是,由于正在执行新的命名约定,子模块存储库在server2上具有不同的名称,这意味着server1上的相对名称与server2上的相对名称不匹配。我将通过重命名server1上的存储库来解决此问题。