我可以链接git子模块与某种回退URL?如果SSH克隆失败,git应该能够使用https进行克隆



(这是我主要在使用GitHub时突然出现的东西,所以我不介意太多,如果任何解决方案是GitHub特定的。但是这个问题本身并不是github特有的,任何解决方案都不一定是。

你可以使用https:

克隆公共GitHub仓库
git clone https://github.com/my-user-name/SDL-mirror

如果你有一个GitHub知道的SSH密钥,你也可以使用SSH克隆repo:

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

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

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

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

但是如果有人想克隆你的仓库怎么办?他们可能没有SSH访问GitHub。所以他们会使用HTTPS URL克隆你的回购…然后当Git试图使用SSH url克隆子模块时就会崩溃。

如果你使用Git repo进行系统配置,这也可能是一个问题。

理想情况下,我希望Git从SSH URL拉,如果可能的话,和HTTPS URL,如果不是。这应该能让每个人都开箱即用。有什么办法能让它这么做吗?

你可以做的是:

  • 用https url注册子模块(或者将当前的ssh url更改为https url)
  • 本地指示Git使用ssh:

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

这样,对于您的本地repo,您总是使用ssh,但对于任何人克隆您的repo,只有https引用。

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

gitclone.sh

#!/bin/bash
# first extracting the repository name
rep_regex="\/([^\/]*)\.git$"
if [[ $1 =~ $rep_regex ]]
then
    reponame="${BASH_REMATCH[1]}"
else
    echo "$1 doesn't match the know pattern" >&2
    exit
fi
echo $reponame
rm -rf $reponame
git clone $1
cd $reponame
ls
sed -E "s/git@([^:]+):/https://1//g" .gitmodules > .gitmodules1
mv .gitmodules1 .gitmodules
git submodule update --init --recursive

最新更新