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

6

我经常在推送到我的私人项目和工作项目之间切换时遇到身份验证问题。每次从工作环境切换到个人环境时,我都要花一些时间处理我的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账户的用户名登录,我该怎么办?


我不确定这对你有多大的相关性,但你可能想要检查一下 git-passport - Richard-Degenne
从我所了解的情况来看,这不需要任何第三方工具。 - Alex Bollbach
1个回答

6

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密钥(和用户名)。

修复现有存储库

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

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

git-passport

您也可以尝试使用git-passport,正如评论中RichouHunter所建议的那样。我没有使用过这个工具,无法对其进行担保,但它似乎试图解决同样的问题。


1
我不熟悉将“-something”附加到克隆URL的做法。通常,SSH URL X 的克隆看起来像git@github.com:Work/ourProduct.git。因此,我运行git clone X。是Git还是SSH处理这个带有“-personal”的URL模式?换句话说,GitHub如何知道github.com-personal:repoPath是什么?它只知道该存储库存在于github.com / repoPath吗?还是SSH通过从ssh配置文件中查找来替换github-personal.com为github.com? - Alex Bollbach
1
@AlexBollbach SSH使用github.com-personal~/.ssh/config加载配置文件。该配置文件的Hostname参数是实际连接的主机名。 - Dan Lowe
非常感谢您提供这个非常有帮助的答案! - Alex Bollbach
即使阅读了SSH手册和Github文档,我也不会自己想出在配置文件中使用映射到不同SSH密钥对的单独主机,并将其映射到两个不同帐户的组合。 - Alex Bollbach
1
@tianz 看起来是这样的 - 回答已更新。这是OpenSSH配置,不仅适用于macOS,在任何使用OpenSSH的地方都是一样的。 - Dan Lowe
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接