推送到 .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 连接时首先提供的身份。
编辑:我现在已经在回答 的上下文中很好地测试了这个过程,并更正了上面过程中的一些错误。
我经常用谷歌搜索。但是执行'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 连接时首先提供的身份。
编辑:我现在已经在回答