推送到 .git 但拒绝给错误的用户,终于解决了

Push to .git but denied to wrong user , finally solved

我经常用谷歌搜索。但是执行'git push -u origin master'后还是报错。 最后我执行'git push -u origin master'成功了,但是我真的不知道错误在哪里。请耐心阅读以下内容。

1,我有一个 git 帐户 'HelenZeng',现在我有另一个帐户 'Snowbabe'

2、我生成了两个ssh key,一个是id_rsa_helen,一个是id_rsa_snow

3、我摸~/.ssh/config

#github.snowbabe
  Host github.com-Snowbabe
          HostName github.com
          User Snowbabe
          IdentityFile ~/.ssh/id_rsa_snow

  #github.helenzeng
  Host github.com-HelenZeng
          HostName github.com
          User HelenZeng
          IdentityFile ~/.ssh/id_rsa_helen

4、google了一下,说实话,我真的不知道为什么要用ssh-add

$ ssh-add ~/.ssh/id_rsa_helen
$ ssh-add ~/.ssh/id_rsa_snow
$ ssh-add -l
  4096 SHA256:Ky5cNi8JKMUuguV0Snt4epmwFn2MgAk19nzF3MJujWU 
  /Users/'username'/.ssh/id_rsa_helen (RSA)
  4096 SHA256:hMfQyemWSz+f+AHrmsbZdhrDb11U+wA4xXeG3X1u28E 
  /Users/'username'/.ssh/id_rsa_snow (RSA)

5,我创建了一个react app项目,我想把它推送到gitHub仓库(到git账户'Snowbabe')。

$ git init
$ git remote add origin git@github.com:Snowbabe/React-study.git

6,这是我的.git/config

[remote "origin"]
       url = git@github.com:Snowbabe/React-study.git
       fetch = +refs/heads/*:refs/remotes/origin/*

正确url

7、最后一步

$ git push -u origin master
  ERROR: Permission to Snowbabe/React-study.git denied to HelenZeng.
  fatal: Could not read from remote repository.

  Please make sure you have the correct access rights

尝试解决:

$ ssh-add -l
 4096 SHA256:Ky5cNi8JKMUuguV0Snt4epmwFn2MgAk19nzF3MJujWU 
 /Users/'username'/.ssh/id_rsa_helen (RSA)
 4096 SHA256:hMfQyemWSz+f+AHrmsbZdhrDb11U+wA4xXeG3X1u28E 
 /Users/'username'/.ssh/id_rsa_snow (RSA)

/** delete all **/
$ ssh-add -D
 All identities removed.

/** just ssh-add id_rsa_snow **/
$ ssh-add ~/.ssh/id_rsa_snow
$ ssh-add -l
 4096 SHA256:hMfQyemWSz+f+AHrmsbZdhrDb11U+wA4xXeG3X1u28E 
 /Users/yaxian/.ssh/id_rsa_snow (RSA)

现在,执行'git push -u origin master'

$ git push -u origin master
Counting objects: 18, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (18/18), done.
Writing objects: 100% (18/18), 165.52 KiB | 0 bytes/s, done.
Total 18 (delta 0), reused 0 (delta 0)
To github.com:Snowbabe/React-study.git
 * [new branch]      master -> master

成功。

我想你想知道 ssh-add 的作用,以及为什么第一种使用 ssh-add 的方法失败而第二种方法成功。我在回答这个假设的时候。

为什么ssh-add会这样工作

ssh-add 用于在您的 ssh 代理中加​​载特定身份。您有几个可用的身份,您的 ssh 代理会将它们提供给您尝试连接的任何服务器,顺序我不完全理解。

在典型情况下,给定的服务器只会接受您的一个身份。例如,假设我添加 id_rsa_server1 连接到 host1,添加 id_rsa_server2 连接到 host2。当我连接到 host1 时,ssh 向服务器提供 id_rsa_server1 并成功连接。当我连接到 host2 时,ssh 首先提供 id_rsa_server1,但失败了,然后尝试下一个 is_rsa_server2,现在成功了。

加载两个身份时的问题是 github.com 知道海伦和雪。您想使用 snow 登录,因为这是对该特定存储库具有权限的帐户,但 ssh 层成功使用第一个接受的密钥 helen,它没有所需的权限。

因此,当您卸载您的身份并仅加载正确的身份时,一切正常,因为这次您登录 github.com as snow,并具有执行推送所需的权限。

我希望这有助于澄清正在发生的事情。

.ssh/config

的替代和推荐解决方案

因为您是通过该名称连接到 github.com,所以我认为您的 .ssh/config 没有做任何事情。只有当您连接到 github.com-Snowbabe 作为服务器名称时,它才会执行某些操作。

这应该有效:

.ssh/config 用户=git:

Host github.com-Snowbabe
   HostName github.com
   User git
   IdentityFile ~/.ssh/id_rsa_snow

将您的 Git 存储库设置为使用此远程名称:

git remote set-url origin github.com-Snowbabe/React-study.git

使用这些设置,您的 ssh 代理将在使用该主机名时使用正确的身份文件:.ssh/config 中定义的别名指定用户名(在 [=21 上必须始终是 git =]) 和身份(Snow 的 RSA 密钥)。您仍然需要像以前一样 ssh-add id_rsa_snow,但是此配置会覆盖通过 ssh 连接时首先提供的身份。

编辑:我现在已经在回答 的上下文中很好地测试了这个过程,并更正了上面过程中的一些错误。