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

Mik*_*eMB 40 git git-submodules gitlab

问题:
有没有办法通过与主存储库相同的方法(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文件调整为他们喜欢的任何内容,并确保他们不会意外地提交这些更改,如果有一种方法只需指定服务器和repo路径并且git选择其中一个,那就太好了.用于主repo的方法,或者可以在gitconfig中设置的方法.

Mik*_*eMB 54

我最终通过将子模块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
Run Code Online (Sandbox Code Playgroud)

这意味着即使您通过ssh检出主应用程序,仍然可以通过https访问子模块utils.

但是,您可以用这样的相对路径替换绝对路径:

[submodule "utils"]     
    path = libs/utils   
    url = ../utils.git
Run Code Online (Sandbox Code Playgroud)

从现在开始使用

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

获得您想要的整个存储库结构.显然,这对于相对ssh和https路径不相同的情况不起作用,但至少对于gitlab托管的存储库来说就是这种情况.

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

  • 谢谢你,在更改“.gitmodules”之后,我还必须执行另一件事:运行;`git submodulesync` (参考;https://dhoeric.github.io/2017/https-to-ssh-in-gitmodules/) (4认同)

Bre*_*dly 19

我想我有一个更一般的答案,但它并不完全是自动的。您可以应用一个配置设置~/.gitconfig,将特定的 URL 替换为您选择的 URL。

因为Github我有这个~/.gitconfig

[url "ssh://git@github.com/"]
    insteadOf = https://github.com/
Run Code Online (Sandbox Code Playgroud)

这是一个带有使用 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