Windows中具有Git的多个Github帐户

时间:2019-03-21 04:19:35

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

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

基本上是这样的,

  • 第一次使用git时要求github凭证 推送到存储库。这些凭证然后用于所有 无论回购是如何克隆的,都会进行推送(使用哪个ssh密钥, 等)
  • 为两个github帐户生成SSH密钥,并将条目添加到 ssh config将这些标识文件作为目标。密钥被添加到每个 还有github帐户。
  • 使用ssh配置中的相应主机条目克隆原始存储库 帐户git clone:/。git
  • 尝试将更改推送到存储库,并成功使用克隆存储库 ssh config中第二个帐户git clone的相应主机条目 <第二主机>:<第二用户名> /。git
  • 尝试将更改推送到存储库并收到原始错误 用户名没有权限,即使使用 第二个用户,更具体地说是ssh密钥。

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

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

我终于可以使用以下命令推送更改:

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

我既要向遇到此问题的其他人发布此信息,又要问几个问题,

  1. 我知道此命令实质上是在ssh连接进行推送时指定要使用的ssh连接的密钥,但是如果使用相同的身份文件克隆了该密钥,为什么还没有将其作为目标?

    < / li>
  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.

3 个答案:

答案 0 :(得分:3)

  

清除Windows凭据管理器中的git条目无法解决此问题。

如果您使用的是ssh URL(git@github.com:<user>/<repo>),则不涉及凭据管理器::它仅提供https:// URL的凭据。

  

首次使用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!

如果user2条目的SSH配置引用了user1私钥,则您不能期望将推送作为user2。

答案 1 :(得分:1)

在与VonC的对话中,您可以在ssh配置文件中清楚地看到第二个用户的身份文件不正确,因为它指向第一个用户文件。从第一个条目复制了第二个条目,并且此值未更改。

修改值以指向正确的键后,即〜/ .ssh / schwaggs_key,我可以克隆并推送而不会出现问题。附带说明,我必须在git中为从每个用户提取的每个存储库设置用户的电子邮件和名称属性,即在回购库中一次,

git config user.email "github account email"

git config user.name "github account username"

答案 2 :(得分:1)

您需要做的是为第二个Github帐户创建一个新的ssh密钥,因为默认情况下git使用的是您第一个Github帐户的密钥,当您尝试从第二个Github帐户进行推送时,您将获得远程权限: privateuser / privaterepo.git被拒绝给workuser。在这种情况下,workeruser是您的第一个Github帐户的用户名。因此,您无法使用第一个Github帐户的用户名推送到第二个Github帐户。请点击此链接以获取帮助。

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