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

时间:2019-03-27 07:33:33

标签: git github ssh git-push

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

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

2,我生成两个ssh密钥,一个是id_rsa_helen,另一个是id_rsa_snow

3,我触摸〜/ .ssh / config

@Test
public void testGetFruitItemMap() {
    Map<String, Fruit> fruitItemMap = new HashMap<>();
    FruitItemImpl doa1 = Mockito.spy(dao);
    Mockito.doReturn(fruitItemMap.values().iterator()) // Here!
           .when(doa1).getAllItemsBelongingToApple("Apple");
    Assert.assertEquals(fruitItemMap.size(), doa1.getFruitItemMap().size());
}

4,老实说,我尝试过谷歌搜索,我真的不知道为什么要使用ssh-add

#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

5,我创建了一个react app项目,我想将其推送到gitHub存储库(到git帐户“ Snowbabe”)。

$ 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)

6,这是我的.git / config

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

这是正确的网址

7,最后一步

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

尝试解决:

$ 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

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

$ 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)

成功。

1 个答案:

答案 0 :(得分:2)

我想您想知道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,并具有进行推送所需的权限。

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

使用.ssh/config的替代和推荐解决方案

由于您要使用该名称连接到github.com,因此我认为您的.ssh/config不会执行任何操作。仅当您以服务器名称连接到github.com-Snowbabe时,它才会起作用。

这应该有效:

.ssh/config和User = 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中定义的别名指定用户名(在git上始终为github.com )和身份(Snow的RSA密钥)。您仍然需要像以前一样ssh-add id_rsa_snow,但是此配置会覆盖通过ssh连接时首先提供的身份。

编辑:在回答similar question的情况下,我现在已经很好地测试了此过程,并更正了该过程中的一些错误。