6

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

基本上是这样的,

  • 第一次使用 git,它在推送到存储库时会要求提供 github 凭据。然后,这些凭据将用于所有推送,无论 repo 是如何克隆的(哪个 ssh 密钥、用户等)
  • 为两个 github 帐户生成 SSH 密钥,并将条目添加到 ssh 配置以定位这些身份文件。密钥也会添加到每个 github 帐户中。
  • 使用 ssh 配置中相应的主机条目克隆 repo,用于原始帐户 git clone :/.git
  • 尝试将更改推送到 repo 并成功克隆 repo 使用 ssh 配置中的相应主机条目为第二个帐户 git clone <2nd Host>:<2nd username>/.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.
4

3 回答 3

4

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

如果您使用 ssh URL ( git@github.com:<user>/<repo>),则不涉及凭证管理器:它仅提供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!

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

于 2019-03-21T05:44:31.250 回答
3

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

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

git config user.email "github account email"

git config user.name "github account username"
于 2019-03-22T03:45:06.050 回答
1

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

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

于 2020-06-03T11:45:03.683 回答