【问题标题】:Multiple Github Accounts With Git In Windows在 Windows 中使用 Git 的多个 Github 帐户
【发布时间】:2019-08-11 21:54:16
【问题描述】:

我最近遇到了一个问题,即我无法将更改推送到我作为另一个用户从我在桌面上的 git 中推送的第一个用户克隆下来的存储库中。

基本上是这样的,

  • 第一次使用 git 时会要求提供 github 凭据 推送到存储库。然后将这些凭据用于所有 无论 repo 是如何克隆的(哪个 ssh 密钥、用户、 等)
  • 为两个 github 帐户生成 SSH 密钥并将条目添加到 ssh 配置以针对这些身份文件。密钥被添加到每个 github 帐户也是如此。
  • 使用 ssh 配置中对应的主机条目克隆 repo 帐号 git clone :/.git
  • 尝试将更改推送到 repo 并成功克隆 repo 使用 第二个帐户 git clone 的 ssh 配置中对应的主机条目 :/.git
  • 尝试将更改推送到 repo 并收到原始错误 用户名没有权限,即使这是使用克隆的 第二个用户,更具体地说是 ssh 密钥。

  • 清除 windows 凭据管理器中的 git 条目没有 解决这个问题。

  • 清除全局用户名和电子邮件未解决此问题

我终于能够使用以下内容推送我的更改:

GIT_SSH_COMMAND="ssh -i <path to private ssh key for second user>" git push

我为遇到此问题的其他人发布此信息并提出一些问题,

  1. 我了解此命令本质上是指定 ssh 连接在推送时使用的密钥,但是如果使用相同的身份文件克隆此密钥,为什么它尚未成为目标?

  2. 是否有任何替代方法或更好的方法,而不是繁琐的工作,例如手动更改配置值或从 Windows 凭据管理器中删除条目?

因此,目标是将更改推送到多个 github 帐户,而无需执行临时指定要使用的 ssh 密钥之类的操作。


HTTP 路径

https://github.com/schwaggs/testssh

https://github.com/jjschweigert/testrepo

SSH 路径

git@github.com:schwaggs/testssh.git

git@github.com:jjschweigert/testrepo.git

SSH 配置文件

$ cat ~/.ssh/config
Host jjschweigert
 HostName github.com
 User git
 IdentityFile ~/.ssh/jjschweigert_key
Host schwaggs
 HostName github.com
 User git
 IdentityFile ~/.ssh/jjschweigert_key

使用原始帐户克隆

$ git clone jjschweigert:jjschweigert/testrepo.git
Cloning into 'testrepo'...
remote: Enumerating objects: 28, done.
remote: Counting objects: 100% (28/28), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 28 (delta 0), reused 28 (delta 0), pack-reused 0
Receiving objects: 100% (28/28), done.

推送到原始帐户 (jjschweigert)

$ git push
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 261 bytes | 43.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To jjschweigert:jjschweigert/testrepo.git
   c082e38..31b7830  master -> master

从第二个帐户克隆 (schwaggs)

$ git clone schwaggs:schwaggs/testssh.git
Cloning into 'testssh'...
remote: Enumerating objects: 21, done.
remote: Counting objects: 100% (21/21), done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 21 (delta 0), reused 18 (delta 0), pack-reused 0
Receiving objects: 100% (21/21), done.

推送到辅助帐户

$ git push
ERROR: Permission to schwaggs/testssh.git denied to jjschweigert.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

SSH -T 输出

$ ssh -T jjschweigert
Hi jjschweigert! You've successfully authenticated, but GitHub does not provide shell access.


$ ssh -T schwaggs
Hi jjschweigert! You've successfully authenticated, but GitHub does not provide shell access.

【问题讨论】:

  • 我可以回答这部分:如果使用相同的身份文件克隆此密钥,为什么它尚未成为目标? 因为git 不存储用于克隆。您必须通过设置$GIT_SSH_COMMAND 环境变量或配置git config core.sshCommand "ssh -i &lt;path to private ssh key for second user&gt;" 或使用主机名来自行配置。
  • phd,它最终成为我的第二个用户在 ssh 配置文件中的错误身份文件路径。感谢您的意见!
  • 只是想为在本地机器上使用两个 github 帐户的未来观众添加这篇文章。这对我帮助很大link

标签: git github git-push git-for-windows


【解决方案1】:

清除 Windows 凭据管理器中的 git 条目并没有解决此问题。

如果您使用的是 ssh URL (git@github.com:&lt;user&gt;/&lt;repo&gt;),则涉及凭据管理器:它只为 https:// URLS 提供凭据。

第一次使用 git,它在推送到存储库时要求提供 github 凭据。

只有当远程源 URL 是 https 时才会出现这种情况。

因此,目标是将更改推送到多个 github 帐户,而无需执行临时指定要使用的 ssh 密钥之类的操作。

这是通过 ssh 配置文件完成的:参见实际示例:


来自编辑

Host user1
 HostName github.com
 User git
 IdentityFile ~/.ssh/iser1_key  <<====
Host user2
 HostName github.com
 User git
 IdentityFile ~/.ssh/user1_key  <<==== same key!? Meaning same user!

如果用户 2 条目的 SSH 配置引用用户 1 私钥,则不能期望以用户 2 身份推送。

【讨论】:

  • 感谢 VonC 的洞察力,
  • 感谢 VonC 的洞察力,如上所述,我使用了多个 ssh 密钥,并且确实在 ssh 配置中添加了条目。使用这些进行克隆时效果很好。但是当作为第二个用户推送时,除非我使用前面提到的命令,否则它不起作用。我还问了两个关于使用配置文件条目的问题。你的意思是如果我不使用 https 克隆任何 repos,我就不应该有默认凭据 git 在推送时尝试使用?
  • “但是当作为第二个用户推送时,除非我使用前面提到的命令,否则它不起作用。”:如果您使用正确的 SSH URL,它会起作用,即指向正确实体的那个ssh 配置。如果没有看到远程源 URL 使用的确切 URL/语法,我无法确定它为什么无法使用第二个用户 SSH 密钥。
  • @Schwagmister “如果我不使用 https 克隆任何存储库,我就不应该拥有 git 在推送时尝试使用的默认凭据?”:这意味着使用 SSH,在这种情况下不需要凭据: SSH 私钥足以识别您的身份。
  • 它使用与原始用户完全相同的格式,但我无法推送,除非我添加该命令以重新指定要使用的身份文件,即使它是使用相同的身份文件克隆的。当我在桌面上时,我可以提供准确的命令以及您需要的任何输出。
【解决方案2】:

根据与 VonC 的对话,您可以在 ssh 配置文件中清楚地看到第二个用户的身份文件不正确,因为它指向第一个用户文件。第二个条目是从第一个条目复制而来的,这个值没有改变。

修改值以指向正确的键后,即 ~/.ssh/schwaggs_key 我可以克隆和推送而不会出现问题。作为旁注,我必须在 git 中为从每个用户提取的每个存储库设置用户的电子邮件和名称属性,即一旦进入存储库,

git config user.email "github account email"

git config user.name "github account username"

【讨论】:

    【解决方案3】:

    您需要做的是为您的第二个 Github 帐户创建一个新的 ssh 密钥,因为默认情况下 git 使用您的第一个 Github 帐户中的密钥,当您尝试从第二个帐户推送时,您将获得远程:权限privateuser/privaterepo.git 拒绝工作用户。在这种情况下,workeruser 是您的第一个 Github 帐户的用户名。所以你不能使用第一个 Github 帐户的用户名推送到你的第二个 Github 帐户。请点击此链接寻求帮助。

    https://www.youtube.com/watch?v=fnSRBRiQIU8

    【讨论】:

    • 您的回答很好,但也可以通过链接到官方 github 文档来改进它,而不仅仅是 youtube 视频。
    猜你喜欢
    • 1970-01-01
    • 2021-04-29
    • 2018-07-09
    • 2022-01-15
    • 1970-01-01
    • 2022-08-18
    • 2012-12-29
    • 2021-02-03
    • 2014-12-24
    相关资源
    最近更新 更多