【问题标题】:Canot push to remote repo - "Please make sure you have the correct access rights and the repository exists."无法推送到远程存储库 - “请确保您拥有正确的访问权限并且存储库存在。”
【发布时间】:2018-10-19 23:20:08
【问题描述】:

由于在推动我的私人项目和我的工作项目之间移动,我经常面临身份验证问题。每次我从工作环境转移到个人环境时,我都会花一些时间处理我的 ssh 密钥和配置。我经常浏览关于生成和添加 ssh 公钥到站点的 github 文档。

今天,我得到:

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
  • 从我所读到的这应该不需要任何第三方工具

标签: git github ssh


【解决方案1】:

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
    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 会在你的 URL 中看到主机名,例如

github.com-personal

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

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

修复现有的存储库

如果您已经有一个 repo,则不需要重新克隆它。您只需更改 URL。

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

git-passport

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

【讨论】:

  • 我不熟悉将-something 附加到克隆网址的做法。通常是一个 ssh url X,我会克隆看起来像 git@github.com:Work/ourProduct.git 。所以我运行git clone X。什么系统处理-personal 的这个 url 架构?混帐? SSH? -- 换句话说,github 怎么知道 github.com-personal:repoPath 是什么?它不只知道这个 repo 存在于 github.com/repoPath 吗?还是 ssh 只是通过从 ssh 配置文件中查找将 github-personal.com 替换为 github.com?
  • @AlexBollbach SSH 使用github.com-personal~/.ssh/config 加载配置文件。该配置文件的Hostname 参数是它实际连接到的主机。
  • 感谢这个非常有帮助的答案!
  • 在配置文件中使用单独的主机映射到 github 映射到两个不同帐户的不同 ssh 密钥对的组合是尽管阅读了 ssh 手册页和github 文档。
  • @AlexBollbach 很高兴为您提供帮助。由于您不确定这为什么有效,因此我扩展了答案以更清楚地解释该部分。
猜你喜欢
  • 2013-07-15
  • 2021-04-18
  • 2018-07-05
  • 2021-12-07
  • 2015-07-16
  • 2018-08-05
  • 2014-11-13
  • 2020-05-08
  • 1970-01-01
相关资源
最近更新 更多