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。我没有使用该工具的经验,所以我不能保证它,但它似乎试图解决同样的问题。