我可以 link git 带有某种回退 URL 的子模块吗?如果 SSH 克隆失败,git 应该可以使用 https 进行克隆

Can I link git submodules with some kind of fallback URL? If SSH clone fails, git should be able to clone using https

(这主要是在使用 GitHub 时突然出现的问题,所以如果有任何解决方案是 GitHub 特定的,我不会太介意。但问题是' t Git本身特定于集线器,任何解决方案都不一定是。)

您始终可以使用 https:

克隆 public GitHub 存储库
git clone https://github.com/my-user-name/SDL-mirror

如果您有 GitHub 知道的 SSH 密钥,您还可以使用 SSH 克隆存储库:

git clone git@github.com:my-user-name/SDL-mirror.git

(我认为类似的选项适用于使用 Bitbucket 时。)

添加子模块时也有这两个选项。

添加子模块时,您通常会添加 SSH 版本,因此您可以在原地测试更改后直接从子模块提交。

但是那些试图克隆您的存储库的人呢?他们可能没有 GitHub 的 SSH 访问权限。所以他们会使用 HTTPS URL...

如果您使用 Git 存储库进行系统配置,这也可能是个问题。

理想情况下,如果可能,我希望 Git 从 SSH URL 中提取,如果不能,则从 HTTPS URL 中提取。这应该让每个人都能开箱即用。有什么方法可以做到这一点吗?

您可以做的是:

  • 使用 https url ()
  • 注册您的子模块
  • 本地指示Git to use ssh instead:

    git config --global url.ssh://git@github.com/.insteadOf https://github.com/
    

这样,对于您的本地存储库,您始终使用 ssh,但对于任何克隆您的存储库的人,只有 https 引用。

我制作了一个 bash 脚本,可以在没有 ssh 权限的情况下克隆这样的存储库。
它首先正常克隆存储库,在拉取所有子模块之前,它将所有 ssh-based url 替换为 .gitmodules.
中基于 https 的 url 用法:gitclone.sh <https-based-url>

gitclone.sh

#!/bin/bash

# first extracting the repository name
rep_regex="\/([^\/]*)\.git$"
if [[  =~ $rep_regex ]]
then
    reponame="${BASH_REMATCH[1]}"
else
    echo " doesn't match the know pattern" >&2
    exit
fi

echo $reponame

rm -rf $reponame
git clone 
cd $reponame
ls
sed -E "s/git@([^\:]+):/https:\/\/\//g" .gitmodules > .gitmodules1
mv .gitmodules1 .gitmodules
git submodule update --init --recursive