ERROR: Repository not found, fatal: 无法读取远程仓库。

1,530 阅读7分钟
问题背景和需求

需求:可以同时拉取公司gitlab仓库代码、自己的gitbub仓库代码及gitee仓库代码到本地
问题gitbub拉取代码没问题、giteegitlab出现如下 问题1,以及后续在尝试解决问题的过程中出现 问题2问题3

问题1: ERROR: Repository not found, fatal: 无法读取远程仓库
问题2: kex_exchange_identification: Connection closed by remote host
问题3: ssh: connect to host gitlab.xx.com.cn port 443: Connection refused

问题的本机环境: 查看~/.ssh 有以下文件:

drwx------   5 User  staff   160  5 15 09:52 .
drwxr-xr-x+ 59 User  staff  1888  5 15 09:50 ..
-rw-------   1 User  staff   444  5 15 09:50 id_rsa.github
-rw-r--r--   1 User  staff   124  5 15 09:50 id_rsa.github.pub
-rw-------   1 User  staff   444  5 15 09:50 id_rsa.gitlab
-rw-r--r--   1 User  staff   124  5 15 09:50 id_rsa.gitlab.pub
-rw-------   1 User  staff   444  5 15 09:50 id_rsa.gitee
-rw-r--r--   1 User  staff   124  5 15 09:50 id_rsa.gitee.pub
-rw-r--r--@  1 User  staff   570  5 15 09:53 known_hosts
-rw-r--r--@  1 User  staff   570  5 15 09:53 config

其中config用户配置内容如下:

# Default gitHub user Self
Host github.com
Port 443
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa.github
# Add gitLab user
Host git@gitlab.com
HostName gitlab.com
User git
IdentityFile ~/.ssh/id_rsa.gitlab
# Add gitee 
Host gitee.com
Port 22
HostName gitee.com
User git user
IdentityFile ~/.ssh/id_rsa.gitee
# Add Company
Host git@gitlab.xx.com.cn
HostName http://gitlab.xx.com.cn
User gitLab user
IdentityFile ~/.ssh/id_rsa.gitlab

我理解的问题原因(不一定准确):以上问题的出现在于用户配置文件config中内容与known_hosts配置冲突,在clone时出现了连接匹配不正确。

在参考网上解决方案的时候往往会与预期出现不一致的结果,同时可能会引发新的问题,因为网上提供解决方案的作者电脑环境和配置是与读者可能存在差别,所以不一定完全适用于自己,那么此时可以通过遵循官方文档的方式,还原本机原始状态,清空本机原有配置,然后按照文档提供的步骤重新开始安装、配置、测试。

使用 SSH 连接到 GitHub
使用 SSH 连接到 Gitee
使用 SSH 连接到 GitLab

本次解决步骤

截图里电脑已经安装了github/gitlab的配置后,再次添加giteessh配置操作

截屏2024-01-08 上午11.04.40.png

0. 前置

  1. 如果之前有配置过某个ssh,可删除.ssh目录
  2. 删除gitlabgithubgitee平台中在用户-设置-SSH 配置页所添加的publicKey 譬如github SSH And GPG keys,命令如下:
rm -rf ~/.ssh 删除~/.ssh文件夹
ls ~/.ssh 查看~/.ssh 此时为空文件夹
open ~/.ssh/known_hosts 如果删除无法打开
// 其他操作命令
vim ~/.ssh/known_hosts 编辑~/.ssh/known_hosts

1. 查看git用户配置

git config --global --list

2. 删除全局git用户配置

$ git config --global --unset user.name "xxx"
$ git config --global --unset user.email "xxx@yyy.com"

3. 分别为gitlabgithubgitee生成SSH key
注意:这里的 xxx@yyy.com 只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱,同时id_ed25519_hub/id_ed25519.gitlab/id_ed25519.gitee分别对应github/gitlab/gitee生成了id_ed25519文件。

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519.hub -C "xxx@yyy.com"
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519.gitlab -C "xxx@yyy.com
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519.gitee -C "xxx@yyy.com"

4. 查看~/.ssh目录的github/gitlab/gitee的id_ed25519`文件

ls -al ~/.ssh

// 结果如下,会看到用户.ssh通过第3步所生成了不同的id_ed25519文件
drwx------  10 user  staff   320  1  8 10:50 **.**
drwxr-xr-x+ 58 user  staff  1856  1  8 11:20 **..**
-rw-r--r--@  1 user  staff   356  1  8 10:50 config
-rw-------   1 user  staff   399 12 27  2022 id_ed25519
-rw-------   1 user  staff   387  1  8 10:35 id_ed25519.gitee
-rw-r--r--   1 user  staff    86  1  8 10:35 id_ed25519.gitee.pub
-rw-r--r--   1 user  staff    94 12 27  2022 id_ed25519.pub
-rw-------   1 user  staff   419  2 20  2023 id_ed25519_hub
-rw-r--r--   1 user  staff   105  2 20  2023 id_ed25519_hub.pub
-rw-r--r--@  1 user  staff   745  1  8 10:39 known_hosts

5. 将第3步产生的ssh key添加到ssh-agent,根据你的环境,使用不同的命令

ssh-agent bash
ssh-add ~/.ssh/id_ed25519.hub
ssh-add ~/.ssh/id_ed25519.gitlab
ssh-add ~/.ssh/id_ed25519.gitee

6. 配置config(我自己解决并没有创建config),如果有需要,可以根据自己本机环境是否需要添加,可以参考Generating a new SSH key and adding it to the ssh-agentconfig The contents to be filled in are as follows

截屏2022-05-15 上午11.15.32.png 7. 查看~/.ssh目录的config文件,我电脑可用的配置信息如下:

# gitlab
Host git@gitlab.xxx.com
    HostName git@gitlab.xxx.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_ed25519
# github
Host github.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519_hub
# gitee
Host gitee.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519.gitee

8. 新增 SSH 密钥到 GitHub、Gitee、GitLab 帐户,参考adding-a-new-ssh-key-to-your-github-account

9. 测试 SSH 连接,参考testing-your-ssh-connection

ssh -T git@github.com
ssh -T git@gitlab.com
ssh -T git@gitee.com

截屏2022-05-15 上午11.44.06.png

10. 测试克隆仓库结果,如上图,已成功克隆三大平台仓库代码

其他:ssh-keygen命令摘要,如ssh-keygen -R HOSTNAME
b “Bits” 此选项指定密钥中的位数。管理 SSH 用例的法规可能要求使用特定的密钥长度。一般来说,2048 位被认为足以用于 RSA 密钥。
e “Export” 此选项允许在 OpenSSH 密钥文件格式和[RFC 4716](https://tools.ietf.org/html/rfc4716) “SSH Public Key File Format”中记录的格式之间重新格式化现有密钥。
p  [-P old_passphrase] “Change the passphrase” 此选项允许使用和 [-N new_passphrase],更改私钥文件的密码`  [-f keyfile]  `。
t “Type” 此选项指定要创建的密钥的类型。常用值有:rsa表示[RSA]
i "Input" 当需要*ssh-keygen*来访问现有密钥时,此选项指定文件。
f "File" 指定存储创建的密钥的文件的名称。
N "New" 为密钥提供新密码。
P "Passphrase" 在读取密钥时提供(旧)密码。
c "Comment" 更改密钥文件的注释。
p 更改私钥文件的密码。
q ssh-keygen。
v 详细模式。
l "Fingerprint" 打印指定公钥的指纹。
B "Bubble babble" 显示密钥文件的“bubble babble”(Tectia 格式)指纹。
F 在 known_hosts 文件中搜索指定的主机名。
R 从 known_hosts 文件中删除属于主机名的所有密钥。
y 读取私有 OpenSSH 格式文件并将 OpenSSH 公钥打印到标准输出。

问题3: ssh: connect to host gitlab.xx.com.cn port 443: Connection refused或者ssh: connect to host gitee.com port 22: Operation timed out

以上问题3可能解决的方案

原因可能是etc/hosts里的ipdomain映射有问题或者是~/.ssh/config所配置Port不匹配

  1. 先在终端ping gitee.com或者ping github.com,此时一般会timeout
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
  1. 可以找到hosts,如我的电脑hosts里历史配置有180.97.125.228 gitee.com,直接删除这一行,或者删除下~/.ssh/config的端口号

hosts文件中

****Mac**修改**hosts****
1.  打开终端,输入 sudo vi /etc/**hosts** ,回车。
1.  输入密码,回车,**hosts**文件就打开了。
1.  输入 i ,即insert,进入**编辑**模式,输入需要映射的ip和域名。
1.**编辑**完毕后,按esc键结束**编辑**模式,输入 :wq 保存并退出。
##
# Host Database
##
127.0.0.1 localhost
180.97.125.228 gitee.com // 直接将这一行删除
# End of section

~/.ssh/config文件中

# gitee
Host gitee.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519.gitee
  Port 22 // 直接将这一行删除

3.再次执行ssh -T git@gitee.com,成功授权

ssh -T git@gitee.com
Hi xx! You've successfully authenticated, but GITEE.COM does not provide shell access.

截屏2024-01-09 下午11.06.07.png

总结

解决问题是一个寻求解决方案资源、不断调试验证的过程,如何找到优质资源,如何理解内容,因人而异,更重要的是需要针对知识缺口、缺乏体系化的思维和架构进行查漏补缺,同时将资源、知识整合成网络并相互关联起来,让读者和作者的语言是互通的,如果针对一个问题能够以点带面的去研读相关官方论文和成套的文档资料,真正深入理解,才能形成一套如何去解决问题的一套模型,或许在遇到不同类型的问题再去解决时,根据过去建立起来的模型与经验,能够达到事半功倍的目的。我认为我虽然达成了我这次的需求和目的,但是这个过程依然是模棱两可,我想深入的过程需要让学习结构化,希望后续自己能够学会这样的思维能力。

参考

SSH keys
Open SSH Manual Pages
Configure a development environment where gitlab, GitHub and gitee (code cloud) coexist
Understanding the SSH Encryption and Connection Process
配置文件~/.ssh/config和/etc/ssh/ssh_config
What is the known_hosts File for ssh in Linux?
SSH config file for OpenSSH client