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

问题:
是否有办法通过与主存储库相同的方法(ssh 或 https)自动签出 git 子模块?

背景:

We have a non-public gitlab repository (main) that has a submodule (utils) which is also hosted as a non-public gitlab repository on the same server. Those repositories can be accessed either via ssh or https:

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

这两种变体显然都需要不同形式的身份验证,根据客户端计算机和用户的不同,这两种身份验证都是首选的。

对于顶级存储库(main) ,这不是问题,因为任何人都可以选择自己喜欢的方法,但是对于子模块,这取决于 .gitmodules文件,因此(最初)对所有子模块都是相同的。
现在不是每个人都要去适应。Gitmodule 文件到他们喜欢的任何地方,并确保他们不会意外地提交这些更改,这将是很好的,如果有一种方法可以只指定服务器和回购路径,git 选择要么是用于主回购的相同方法,或者可以在 gitconfig 中设置的东西。

31670 次浏览

我最终通过将子模块 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 签出主应用程序,子模块 utils 仍然可以通过 https 访问。

但是,您可以用一个相对路径替换绝对路径,如下所示:

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

and from now on use

  • 无论是 git clone --recursive https://gitlabserver.com/my/path/main.git
  • git clone --recursive user@gitlabserver.com:my/path/main.git

以任意方式获得整个存储库结构。显然,对于相对 ssh 和 https 路径不相同的情况,这种方法不起作用,但至少对于 gitlab 托管的存储库来说是这样的。

This is also handy if you (for whatever reason) mirror your repository structure at two different remote sites.

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

For Github I have this in my ~/.gitconfig:

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

Here's a repository with a submodule declared with an HTTPS url that I can clone recursively using HTTPS.

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

OR

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

You can read about its use here: https://git-scm.com/docs/git-config#Documentation/git-config.txt-urlltbasegtinsteadOf

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