Canot推送到远程仓库 - "请确保您拥有正确的访问权限并且存储库已存在。"

时间:2017-07-05 15:26:52

标签: git github ssh

我在推送私人项目和工作项目之间不断面临身份验证问题。每次我从工作环境转移到个人环境时,我都会花一些时间来处理我的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的理解是,它在某种意义上是#34;无账的"。没有用户名或密码是ssh连接过程的一部分。所以现在我认为身份验证问题围绕着一些系统相信我已经以我的私人github帐户的用户名登录,我该怎么办?

1 个答案:

答案 0 :(得分:2)

GitHub如何知道你是谁

  

我对ssh的理解是,它在某种意义上是#34;无账的"。没有用户名或密码是ssh连接过程的一部分。所以现在我认为身份验证问题围绕着一些系统相信我已经以我的私人github帐户的用户名

登录

你是对的:问题是GitHub假设您的GitHub用户名,但它并不总是符合您当前的需要。

所有SSH连接都有一个用户名。在GitHub的情况下,它总是" git"。这就是" git @" GitHub网址的一部分,例如

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
    Username git
    IdentityFile ~/.ssh/id_github_work

Host github.com-personal
    Hostname github.com
    Username git
    IdentityFile ~/.ssh/id_github_personal

现在,您可以使用主机名控制使用的密钥。您可以像这样克隆:

git clone github.com-personal:yourusername/projectname

它将使用您的个人密钥。要使用其他密钥,只需使用其他主机名。

为什么会这样?

SSH会在您的网址中看到主机名,例如

github.com-personal

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

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

修复现有的回购

如果您已经拥有回购,则不需要重新克隆它。您只需更改网址即可。

git remote set-url origin github.com-personal:yourusername/projectname

GIT-护照

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