如何通过 Windows Git 凭据管理器使用多个 Git 帐户

Posted

技术标签:

【中文标题】如何通过 Windows Git 凭据管理器使用多个 Git 帐户【英文标题】:How to use multiple Git accounts with Windows Git Credentials Manager 【发布时间】:2022-01-15 17:40:55 【问题描述】:

我已经设置了 git config 如下:

Host ACCOUNT1
    HostName github.com
    Port 22
    User git-username1
    IdentityFile ~/.ssh/id_rsa_2

Host ACCOUNT2
    HostName github.com
    Port 22
    User git-username2
    IdentityFile ~/.ssh/id_rsa

当我 git push ACCOUNT1 staging 失败并显示“Permission denied...(PublicKey)”

这是因为无论我如何重新排列主机(上面的 ACCOUNTS1 和 ACCOUNTS2),Windows 总是使用IdentityFile ~/.ssh/id_rsa

直到我将IdentityFile ~/.ssh/id_rsa_2 重命名为IdentityFile ~/.ssh/id_rsa,然后git push ACCOUNT1 staging 工作......

所以每次我必须推送到一个帐户时,我都必须确保其私钥完全命名为“id_rsa”

有没有人有解决方案来确保 Windows 上的 git FOLLOW git config set IdentityFile 而不是完全落入“id_rsa”?

【问题讨论】:

您确实设置了配置的 ssh 部分,但您仍然需要配置 git 的远程配置以使用不同的 URL。请参阅git push 的手册页。 @A.H.我已将远程 url 设置为 git@gihtub.com:username/repo .... 这就是为什么当我更改密钥的命名以匹配 accounts1 和 accounts2 远程 URL 的 id_rsa 时它可以工作... 【参考方案1】:

我已将远程网址设置为git@gihtub.com:username/repo

其实,如果你想要你的~/.ssh/config 条目,你需要将遥控器设置为:

git remote add ACCOUNT1 ACCOUNT1:username/repo
# or, if remote ACCOUNT1 already exists
git remote set-url ACCOUNT1 ACCOUNT1:username/repo

只有git push ACCOUNT1 staging 轻松工作。

如果没有名为 ACCOUNT1 的远程,git push 将使用 URL ACCOUNT1,类似于 git@gihtub.com,带有 id_rsa_2,但是... 没有 username/repo。 单独推送到git@gihtub.com 将始终是“权限被拒绝”。

~/.ssh/config 中的 User 条目应始终为:

User git

任何其他远程用户都将被“拒绝”。

【讨论】:

谢谢!您的解决方案仅在我进行如下编辑时才有效:将我的配置文件 User ACCOUNT1 更改为 User git 。也许甚至删除那条线也会起作用 @CodeOneOnOne 好点。我已经编辑了答案以使其更清楚。【参考方案2】:

VonC already provided the short answer.这是长篇。

您混淆了 Git 的 凭据(与 http / https 一起使用)和 ssh 的 基于公钥/私钥的身份验证。特别是这些东西:

Host ACCOUNT1
    HostName github.com
    Port 22
    User git-username1
    IdentityFile ~/.ssh/id_rsa_2

是一组 ssh 指令,您可以将其放入您的 .ssh/config 文件中。 Git 只是运行 ssh; ssh 然后做所有事情。

这些说明略有缺陷。特别是你想要User git,而不是User git-username1。这允许您在 ssh 请求中省略 git@。 (如果包含git@,则此处的User 行将被忽略,因此该缺陷变得不重要。)

制作 ssh 使用这些指令,您必须将ssh 定向到名为ACCOUNT1 的伪0 主机:

ssh -Tv ACCOUNT1

例如,从命令行或ssh -Tv git@ACCOUNT1。 SSH 将字符串文字 ACCOUNT1Host 行匹配,然后在联系实际主机时使用剩余的指令 —HostNamePortUserIdentityFile。主机 ssh 联系人是HostName 部分中列出的联系人,即github.com。使用的端口是 22(ssh 标准,因此无需列出)。示例中的用户名将是 git-username1,这是错误的,因此您需要 git@ACCOUNT1 作为替代方法来覆盖用户名。

还缺少一行:IdentitiesOnly yes。这不是必需,但有助于减少 ssh 在联系 github.com 时尝试的密钥数量。使用IdentitiesOnly yesIdentityFile 行中列出的每个键(您可以有多个)将按照列出的顺序进行尝试。顺序可能很重要,因为某些服务器可能会在前几个键之后悄悄地忽略键。 (想象一下你是守门人,看着人们上来在城堡门口的锁里试钥匙。有人——你看不到谁,因为光线太暗了——拿出一个巨大的钥匙圈,上面有 1000钥匙在上面,一一尝试。你觉得这个人怎么样?)

所以,我喜欢做的是:

Host gh1
    HostName github.com
    User git
    IdentitiesOnly yes
    IdentityFile ~/.ssh/id_github1

Host gh2
    HostName github.com
    User git
    IdentitiesOnly yes
    IdentityFile ~/.ssh/id_github2

等等。然后,在创建或更新 URL 时,我使用:

git clone ssh://gh1/user/repo.git

或:

git remote set-url origin ssh://gh2/user/repo.git

视情况而定。为了测试每个 ssh 设置,我使用:

ssh -T gh1

或:

ssh -Tvvv gh2

视情况而定。这里vs 的数量决定了来自 ssh 的额外调试输出的数量:调试级别 1 的内容用一个 v 发出,调试级别 2 的东西用 2 个vs 发出,依此类推。调试级别 1 足以监视正在测试的键。

【讨论】:

很好的答案:向您学习后,我所要做的就是将User ACCOUNT1 更改为User git。和git remote set-url ACCOUNT1 ACCOUNT1:username/repo 根据你在下面@VonC 的回答

以上是关于如何通过 Windows Git 凭据管理器使用多个 Git 帐户的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用适用于 Windows 的 Git 凭据管理器?

windows10 管理git账凭据管理器

git clone authentication failed问题

git clone authentication failed问题

git clone authentication failed问题

将多个 git 个人访问令牌 (PAT) 与凭据管理器一起使用