如何使用错误的SSH密钥和账户修复Git

广告40岁女领导的提拔日记曝光,泥潭之深,令人瞠目结舌×

连接到远程 Git 服务器(如 Github)时,您的客户端必须使用基于 HTTPS 或 SSH 的令牌进行身份验证。如果您使用后者,您可能会遇到密钥处理问题,包括 Git 使用错误的 SSH 密钥并将您登录到不同的账户。

有什么问题?

如果您的账户中根本没有 SSH 密钥,则在尝试推送时几乎肯定会出现以下错误:

Permission denied (publickey).fatal: Could not read from remote repository.

这可能是最常见的 Git 错误,解决方法很简单--为您的帐户设置 SSH 密钥。

但是,即使正确设置了 SSH 密钥,您也可能会遇到看起来非常相似的错误消息。如果使用多个 Git 帐户,可能会出现此错误:

Permission to Username/Repository.git denied to otheraccount.fatal: Could not read from remote repository.

在这种情况下,Github 已经接受了您的 SSH 密钥,但它仍然无法正常工作;即使您的本地存储git 库配置为使用正确的电子邮件地址,如果您给它错误的密钥,它也会将您验证为错误的用户。这与第一个错误有根本的不同。不是“权限被拒绝”,而是“账户被拒绝权限”。

如果您有多个账户并且需要为每个账户使用单独的密钥,这可能是一个问题。由于 SSH 身份验证的工作方式,它仍然会将您“登录”到 Git 的远程服务器,但是作为错误的用户。当 Github 检查该用户是否有权访问存储库时,它可能会失败,从而产生错误消息,指出您的帐户无权使用您自己的存储库。

解决方案是正确管理多个 SSH 密钥,这样您的git 客户端就不会向服务器发送错误的密钥。您可以通过编辑 SSH 的配置文件来做到这一点。

确保 Git 配置正确

首先,您需要确保您的存储库配置为使用正确的电子邮件地址和用户名。您可以从 Git 配置中检查:

git config --list

并为此存储库设置名称和电子邮件(或--global 用于为所有存储库设置它):

git config user.name "Name"git config user.email "[email protected]"

如果您没有 SSH 密钥问题,这可能就是您所需要的。

编辑 ~/.ssh/config

如果您没有想要使用的现有密钥,则需要为您的帐户生成一个新的密钥文件。如果这样做,您需要将正确的移动或重命名为,~/.ssh 以便它不会与您的默认id_rsa .在这种情况下,我们将创建一个名为“github”的新密钥:

ssh-keygen -t rsa -f ~/.ssh/github

要使用多个 SSH 密钥,您需要~/.ssh/config 为 Github编辑并设置一个新的 Host 块,该块指向您刚刚创建的密钥文件。SSH 将使用它来选择它将使用的 SSH 密钥。

Host main Hostname github.com IdentityFile ~/.ssh/github IdentitiesOnly yesHost old Hostname github.com IdentityFile ~/.ssh/id_rsa IdentitiesOnly yes

如果您只有一个用于新密钥的主机块,则您无需执行任何其他操作,现在就可以连接到 Github。如果您有多个用于不同密钥的块,则需要编辑存储库的远程,以便将github.com 其替换为 SSH 配置文件中主机块的名称。这将手动选择一个键,而不是依赖于冲突的查找。

gitremote remove origingit remote add origin git@main:username/repository.git

故障排除

在设置 SSH 主机配置和远程配置后,Git 应该在推送时使用正确的 SSH 密钥。如果您仍然遇到问题,您可以通过使用GIT_SSH_COMMAND 环境变量手动设置 Git 用于 shell 会话的 SSH 命令来调试问题。

GIT_SSH_COMMAND=ssh -i ~/.ssh/github -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no

您还需要检查并确保 Git 正在使用您期望的位置的密钥。在 Windows 上,此位置可能会因您使用 Git 的软件而异。例如,使用 GUI 客户端 Fork,它默认使用 Windows SSH 代理,但我已经配置了它使用的新 SSH 密钥。

举报/反馈