在Windows系统中使用Git管理多个Github账户

7
我最近遇到了一个问题,在使用git时,我无法将更改推送到一个我从第一个用户克隆下来的存储库中。
基本上是这样的:
1. 第一次使用git要求输入github凭据,以便在将更改推送到存储库时进行验证。不管如何克隆存储库(使用哪个ssh密钥、用户等),这些凭证都会被用于所有推送操作。
2. 为两个github帐户生成SSH密钥,并添加条目到ssh配置文件中以定位这些身份文件。密钥也被添加到每个github帐户中。
3. 使用ssh配置文件中原始帐户对应的Host条目克隆存储库 git clone :/.git。
4. 尝试将更改推送到存储库并成功克隆存储库,使用ssh配置文件中第二个帐户对应的Host条目 git clone <2nd Host>:<2nd username>/.git。
5. 尝试将更改推送到存储库,但收到错误消息,指出原始用户名没有权限,尽管使用的是第二个用户并且具体使用了一个ssh密钥。
6. 清除Windows凭据管理器中的git条目未能解决此问题。
7. 清除全局用户名和电子邮件地址也无法解决此问题。
最终,我通过以下方式成功推送了我的更改:
GIT_SSH_COMMAND="ssh -i <path to private ssh key for second user>" git push

我发布这篇文章,一方面是为了帮助其他遇到同样问题的人,另一方面也是想提出几个问题:
  1. 我知道该命令实质上是指定用于 ssh 连接时进行推送的密钥,但如果使用相同的身份文件克隆,则为什么不会自动选择此密钥?

  2. 是否有其他替代方法或更好的方法,而不像手动更改配置值或从 Windows 凭据管理器中删除条目那样繁琐?

因此,目标是在不必临时指定要使用的 ssh 密钥的情况下,将更改推送到多个 GitHub 帐户。

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 <path to private ssh key for second user>" 或通过操作主机名来实现。 - phd
博士学位,最终在 ssh 配置文件中我的第二个用户的身份文件路径上存在错误。感谢您的输入! - user3470887
只是想为将来在本地机器上使用两个Github帐户的观众添加此文章。 这篇文章对我帮助很大 链接 - dko
3个回答

5
清除Windows凭据管理器中的git条目并没有解决此问题。 如果您使用ssh URL(git@github.com:<user>/<repo>),则不涉及凭据管理器:它仅为https:// URL提供凭据。 只有当远程源URL是https时,才会出现这种情况,第一次使用git时,将在向存储库推送内容时要求输入github凭据。 因此,目标是在不必像临时指定要使用的ssh密钥那样地推送更改到多个github帐户。这可以通过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的见解, - user3470887
感谢VonC的见解,如上所述,我正在使用多个ssh密钥,并已在ssh配置中添加了条目。使用这些克隆时,它可以正常工作。但是当作为第二个用户推送时,除非我使用先前提到的命令,否则它不起作用。我还问了两个关于使用配置文件条目的问题。您是否意味着如果我不使用https克隆任何存储库,则git尝试使用推送时永远不应该有默认凭据? - user3470887
@Schwagmister 那会很有帮助:我无法解释“它使用与原始用户完全相同的格式”。 - VonC
总的来说,我的ssh配置文件中有两个条目,格式都是Host [新主机名] HostName github.com user git IdentityFile [私钥路径]。然后我使用这些条目克隆仓库,git clone [新主机名]:[用户名]/[仓库].git。我进行了一些更改,然后在每个相应的仓库中,当我尝试进行git push时,我能够在从原始帐户克隆的仓库中推送,但在从第二个用户克隆的仓库中,我会收到一条消息,说原始用户没有权限。这意味着它正在尝试以我在Git中使用的原始用户身份进行推送,对吗? - user3470887
我刚刚更新了我的问题,Von,请告诉我是否需要更多信息。 - user3470887
显示剩余11条评论

4
根据与VonC的对话,您可以清楚地在ssh配置文件中看到第二个用户的身份文件是不正确的,因为它指向了第一个用户的文件。第二个条目是从第一个复制的,但这个值没有更改。
将值修改为指向正确的密钥,即~/.ssh/schwaggs_key,我可以无问题地克隆和推送。另外需要注意的是,我必须为从每个用户拉取的每个仓库设置git中的用户电子邮件和姓名属性,即一旦进入仓库内。
git config user.email "github account email"

git config user.name "github account username"

0
你需要做的是为第二个Github账户创建一个新的ssh密钥,因为默认情况下git使用的是第一个Github账户的密钥,当你尝试从第二个账户推送时,你会得到“remote: Permission to privateuser/privaterepo.git denied to workuser”的错误提示。workeruser在这种情况下是你第一个Github账户的用户名。所以你不能使用第一个Github账户的用户名推送到第二个Github账户。请点击此链接获取帮助。

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


你的回答很好,但是如果能够链接到官方的Github文档而不仅仅是YouTube视频,那就更好了。 - 00prometheus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接