无法推送到远程存储库 - “请确保您拥有正确的访问权限并且存储库存在。”

Ale*_*ach 5 git ssh github

由于在推动我的私人项目和我的工作项目之间移动,我不断面临身份验证问题。每次我从工作环境转移到个人环境时,我都会花一些时间处理我的 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.
Run Code Online (Sandbox Code Playgroud)

我尝试生成一个新的 ssh 密钥对并将公钥提交给 github,但 github 说“密钥已在使用中”。我用谷歌搜索了一下,但无法完全理解该错误消息。

切换齿轮我注意到,在运行命令时ssh -T git@github.com,输出以与我的个人帐户用户名关联的 Github 用户而非我的工作用户名迎接我。

我对 ssh 的理解是它在某种意义上是“不负责任的”。没有用户名或密码是 ssh 连接过程的一部分。所以现在我相信身份验证问题围绕着一些系统认为我是作为我的私人 github 帐户的用户名登录的,我该怎么办?

Dan*_*owe 6

GitHub 如何知道您是谁

我对ssh的理解是它在某种意义上是“无帐户的”。ssh 连接过程中不包含用户名或密码。所以现在我相信身份验证问题围绕着某个系统,认为我是作为我的私人 github 帐户的用户名登录的

你是对的:问题是 GitHub 对你的 GitHub 用户名做出了假设,但它并不总是适合你当前的需求。

所有 SSH 连接都有一个用户名。对于 GitHub,它始终是“git”。这是 GitHub URL 的“git@”部分,例如

git@github.com:username/projectname.git
Run Code Online (Sandbox Code Playgroud)

就 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
Run Code Online (Sandbox Code Playgroud)

现在您可以使用主机名来控制使用哪个密钥。你可以像这样克隆:

git clone github.com-personal:yourusername/projectname
Run Code Online (Sandbox Code Playgroud)

它将使用您的个人密钥。要使用另一个密钥,只需使用另一个主机名即可。

为什么这有效

SSH 将在您的 URL 中看到主机名,例如

github.com-personal
Run Code Online (Sandbox Code Playgroud)

在执行其他操作之前,它会查看自己的配置以查看是否有与该主机名关联的任何参数。由于此主机名与我们添加到的条目匹配~/.ssh/config,因此它会加载这些参数。

这些参数之一Hostname告诉 SSH 我们给它的主机名不是服务的真实主机名。SSH(以及 Git)仍将连接到主机名“github.com”,但它将使用此 SSH 配置文件指定的 SSH 密钥(和用户名)。

修复现有的存储库

如果您已经有一个存储库,则无需重新克隆它。您只需更改 URL 即可。

git remote set-url origin github.com-personal:yourusername/projectname
Run Code Online (Sandbox Code Playgroud)

git 护照

您还可以按照 RichouHunter 在评论中的建议尝试git-passport 。我没有使用该工具的经验,所以我不能保证它,但它似乎试图解决同样的问题。