如何引用git子模块的备用URL,具体取决于我在哪里克隆了超级repo



我有一个工作流程,需要能够从一个git服务器(server1(中提取多个repo,并推送到另一个git服务器(server2(。服务器2位于没有互联网接入的网络上,一些转发使用子模块,这些子模块指代服务器1上的其他转发。

通常,当我递归地克隆超级repo(包含子模块的repo(时,它会从原始源克隆子模块。但是,在从服务器2进行克隆时,这不是一个选项,因为服务器2无法访问Internet。

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

也就是说,假设服务器2上的所有repo都与服务器1上的repo相同,我希望以下2个命令是等效的,即使服务器2网络上的构建机器无法到达服务器1递归地克隆子模块:

gitclone—递归子模块https://server1/super-repo.git

gitclone—递归子模块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服务器,该服务器可通过本地网络用于server2server1。然后,它可以包含来自网络服务器的子模块分支,但server1server2将很好地从中获得子模块更新…

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

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

最新更新