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所建议的那样。我没有使用过这个工具,无法对其进行担保,但它似乎试图解决同样的问题。