由于在推送到我的私人项目和我的工作项目之间移动,我经常面临身份验证问题。 每次我从工作环境转移到个人环境时,我都会花一些时间处理我的 ssh 密钥和配置。 我经常浏览github文档,以生成和向站点添加ssh公钥。
今天,我得到:
ERROR: Repository not found.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
我尝试生成一个新的 ssh 密钥对并将公钥提交给 github,但 github 说"密钥已在使用中"。 我在谷歌上搜索了一会儿,但无法完全理解该错误消息。
切换档位 我注意到,在运行命令时ssh -T git@github.com
,输出将我视为与我的个人帐户用户名相关联的 Github 用户,而不是我的工作用户名。
我对ssh的理解是,它在某种意义上是"无责任的"。 没有用户名或密码是 ssh 连接过程的一部分。 因此,既然我相信身份验证问题围绕着某些系统认为我以我的私人 github 帐户的用户名登录,我该怎么办?
GitHub 如何知道你是谁
我对ssh的理解是,它在某种意义上是"无责任的"。没有用户名或密码是 ssh 连接过程的一部分。所以现在我相信身份验证问题围绕着某个系统认为我以我的私人 github 帐户的用户名登录
你是对的:问题是 GitHub 对你的 GitHub 用户名做出了假设,但它并不总是适合你当前的需求。
所有 SSH 连接都有一个用户名。在GitHub的情况下,它总是"git"。这是您的 GitHub URL 的"git@"部分,例如
git@github.com:username/projectname.git
就SSH而言,用户名始终为"git"。
但是GitHub(在服务器上运行的应用程序)还有另一层。它会查看您用于进行身份验证的 SSH 密钥,并查找哪个 GitHub 用户具有与其帐户关联的密钥。这就是它将您的SSH连接映射到GitHub用户名的方式。
问题所在
您在 GitHub 上有多个帐户。因此,您需要一种方法来控制正在使用哪一个。但默认情况下,SSH 将始终对"github.com"使用相同的密钥。
解决方案
(下面假设macOS或Linux-如何在Windows中执行此操作是不同的,但相同的概念适用。
您可以通过映射不同的虚拟主机名来控制使用哪个密钥。
假设您有两个密钥,
~/.ssh/id_github_work
~/.ssh/id_github_personal
您可以在~/.ssh/config
中设置这样的配置文件:
Host github.com-work
Hostname github.com
User git
IdentityFile ~/.ssh/id_github_work
Host github.com-personal
Hostname github.com
User git
IdentityFile ~/.ssh/id_github_personal
现在,您可以使用主机名控制使用哪个密钥。您可以像这样克隆:
git clone github.com-personal:yourusername/projectname
它将使用您的个人密钥。要使用其他密钥,只需使用其他主机名。
为什么有效
SSH 将在您的 URL 中看到主机名,例如
github.com-personal
在执行任何其他操作之前,它会查看自己的配置以查看是否有任何与该主机名关联的参数。由于此主机名与我们添加到~/.ssh/config
的条目匹配,因此它会加载这些参数。
其中一个参数Hostname
告诉SSH,我们给它的主机名不是服务的真实主机名。SSH(以及 Git)仍将连接到主机名"github.com",但它将使用此 SSH 配置文件指定的 SSH 密钥(和用户名)。
修复现有存储库
如果已有存储库,则无需重新克隆它。您只需更改网址即可。
git remote set-url origin github.com-personal:yourusername/projectname
吉特护照
您也可以尝试 git-passport 正如 RichouHunter 在评论中建议的那样。我没有使用该工具的经验,所以我不能保证它,但它似乎试图解决同样的问题。