通过ssh或https自动访问git子模块


77

问题:
有没有一种方法可以通过与主存储库相同的方法(ssh或https)自动检出git子模块?

背景:

我们有一个非公共gitlab存储库(main),它具有一个子模块(utils),该子模块也作为非公共gitlab存储库托管在同一服务器上。这些存储库可以通过ssh或https访问:

  • user@gitlabserver.com:my/path/repo.git
  • https://gitlabserver.com/my/path/repo.git

显然,这两种变体都需要不同形式的身份验证,并且取决于客户端计算机和用户,一个或另一个是首选。

对于顶级存储库(main)来说,这不是问题,因为任何人都可以选择他或她喜欢的方法,但是对于子模块,这取决于.gitmodules文件,因此(最初)对于所有文件都是相同的。
现在,不必所有人都根据自己喜欢的方式调整.gitmodules文件,并确保他们不会意外提交这些更改,那就很好了,如果有一种方法可以只指定服务器和存储库路径,而git选择用于主仓库的相同方法,或者可以在gitconfig中设置的方法。


tldr对不起。但是我使用git-hooks来运行git submodule foreach git submodule update或类似。我没有时间写一个正确的答案,但我希望这会有所帮助。
Szabolcs Dombi

Answers:


94

我终于通过指定子模块url作为相对路径解决了这个问题:

所以可以说您的主要git存储库可以访问

  • 通过 https://gitlabserver.com/my/path/main.git
  • 或通过 user@gitlabserver.com:my/path/main.git

.gitmodules文件看起来像这样:

[submodule "utils"]     
    path = libs/utils   
    url = https://gitlabserver.com/my/path/utils.git

这意味着即使您通过ssh签出主应用程序,仍将通过https访问子模块utils。

但是,您可以将绝对路径替换为相对路径,如下所示:

[submodule "utils"]     
    path = libs/utils   
    url = ../utils.git

从现在开始使用

  • 要么 git clone --recursive https://gitlabserver.com/my/path/main.git
  • 要么 git clone --recursive user@gitlabserver.com:my/path/main.git

以获得所需的整个存储库结构。显然,这对于相对的ssh和https路径不相同的情况不起作用,但至少对于gitlab托管的存储库而言,是这种情况。

如果您(出于某种原因)在两个不同的远程站点上镜像存储库结构,这也很方便。


1
如果模块指向其他存储库,这也将不起作用,对吗?例如,如果这是中央项目username@stash.company.net/abc/win/win-agent.git,而这是一个引用的模块username@stash.company.net/abc/mob/module.git
David

1
@David:我无法测试它,但我看不到,为什么它不起作用(显然,../../mob/module.git在这种情况下,您必须使用它)。
MikeMB

我用../测试了它,虽然更新没有失败,但是对我来说似乎不合逻辑,它不起作用,它只应与您编写的../../一起使用。
戴维

好的,下面的工作:根项目username@stash.company.net/scm/win/win-agent.git使用以下配置引用模块username@stash.company.net/scm/mob/module.git:[submodule“ modules / module“] path = modules / module url = ../../mob/module.git
大卫

1
谢谢你,我改变了.gitmodulesdo之后必须做的另一件事; git submodule sync (参考; dhoeric.github.io/2017/https-to-ssh-in-gitmodules
桑德Looijenga

11

我想我有一个更笼统的答案,但这不是很自动。您可以应用一个配置设置,~/.gitconfig该设置将用您选择的一个替换特定的URL。

因为Github我在我的~/.gitconfig

[url "ssh://git@github.com/"]
    insteadOf = https://github.com/

这是一个带有使用HTTPS url声明的子模块的存储库,我可以使用HTTPS递归克隆该子模块。

git clone --recursive https://github.com/p2/OAuth2.git

要么

git clone --recursive git@github.com:p2/OAuth2.git

您可以在此处阅读有关其用法的信息:https : //git-scm.com/docs/git-config#Documentation/git-config.txt-urlltbasegtinsteadOf

而在这里:https : //git-scm.com/docs/git-clone


谢谢。该设置看起来非常有用。我仍希望在可能的地方使用相对路径,因为我可以告诉其他人无需进一步手动配置即可递归克隆存储库X。但是,从另一端看,这似乎是完美的:我想克隆其他人的存储库树,该树不使用与作者预期不同的方法(或镜像)使用相对路径。
MikeMB

而且,如果您当然不能总是使用相对路径。
MikeMB

当然可以 我注意到这在XCode和Swift包管理器中不能很好地工作,但相对子模块也不能。
育种
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.