Git以错误的用户身份推送到远程GitHub仓库

97

我有一个工作用的GitHub账号和一个个人账号。一开始我使用个人账号进行测试项目,后来我在同一台计算机上使用另一个账号创建了一个存储库。

现在我想要再次在个人账号上创建一个新的存储库,我更改了全局和本地的user.name,生成了一对新的ssh密钥,并输入到GitHub设置页面中。然后我设置了目录。

git init
git remote add origin <url>
git push origin

但现在它告诉我:

错误:对personaluser/newrepo.git的权限被拒绝

我不知道另一个帐户如何与此帐户相关联。.git/config没有显示任何与workusername相关的内容。

如果您使用的是Windows 10,请花点时间阅读Rajan的答案。


2
针对Windows 10,请在下方回答。从凭据管理器中删除凭据。浪费了2个小时的时间。 - xenteros
@xenteros 请将此作为答案发布。我浪费了1小时,而你又帮我节省了1小时。 - lexicore
我真的很希望有人能够发布一个答案,解释git在Linux上是如何知道我的帐户名的,即使据我所知它不在任何配置文件中 - 特别是在哪里发生了信息泄漏? - Jack M
16个回答

98

这听起来与我当前的工作设置非常相似。看起来您已经设置了独立的ssh-keys,因此您还需要创建一个~/.ssh/config文件,并填充类似于以下信息:

Host work.github.com
    HostName github.com
    User WORK_GITHUB_USERNAME
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_work_rsa
    IdentitiesOnly yes

Host personal.github.com
    HostName github.com
    User PERSONAL_GITHUB_USERNAME 
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_personal_rsa
    IdentitiesOnly yes

每个属性都听起来很简单易懂,但IdentitiesOnly则不太好理解。 我不会尝试解释它的作用,但它在我的当前设置中运行良好。

值得注意的是,Host URL只是一个指针,用于获取正确的用户设置,对于将文件正确传输到目标HostName url没有任何影响。

现在,您只需要确保您的origin(或者一般的remote)url与您各自存储库中的正确Host url相匹配,具体取决于您的用户名。 如果您已经有现有的个人存储库,可以在文本编辑器中编辑该存储库的.git/config 文件:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@personal.github.com:PERSONAL_GITHUB_USERNAME/project.git

或者通过命令行完成:

git remote set-url origin git@personal.github.com:PERSONAL_GITHUB_USERNAME/project.git

同样适用于您的工作:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@work.github.com:your_work_organization/project.git

或者,同样可以通过命令行实现:

git remote set-url origin git@work.github.com:your_work_organization/project.git

当然,您始终可以将您的Host URL之一设置为您的~/.ssh/config文件中的以下方式:

Host github.com

我只是使用 work.github.com 来更容易地查看配置关系。

设置完成后,您应该能够推送到各自的远程仓库。

编辑

需要注意的一件事是,如果您曾经为user.email值设置全局 git 配置值(我猜 user.name 也会产生不同的值),git 将显示您的提交为该电子邮件用户。为了解决这个问题,您可以在本地仓库中覆盖全局 git 配置设置:

$ git config user.name "John Doe"
$ git config user.email johndoe@example.com

现在,这应该会将提交作为该仓库的正确用户发送。


1
这个网站更全面地解释了ssh配置文件,适合任何有兴趣的人。 - Phil
1
我缺少的关键是在.git/config中指定ssh主机 - 非常感谢! - xdotcommer
我没有权限问题,但在全局 git 配置中具有不同的 user.email,即使使用相同的 user.name,也会导致 Github 上提交的错误用户出现。 - NHol
1
这太完美了!非常感谢你。 - Itope84
1
“IdentitiesOnly yes” 对我来说是缺失的一块拼图。现在它可以正确地选择正确的用户。谢谢。 - James Morgan
1
太好了!像魔法一样顺利地运行。省去了我很多添加/删除键的麻烦。 - Kira

57

前往控制面板 > 用户账户 > 凭据管理器 > 通用凭据

移除 git 凭据。然后运行 git push 命令,此时会提示输入 git 凭据,请输入正确的凭据。


5
这解决了我的问题,当我在Windows10上运行Git Bash时。谢谢@rajan-patil。 - suspicious_williams
1
对于那些没有英文Windows GUI界面的用户,您可以通过在命令行中键入“control /name Microsoft.CredentialManager”来访问凭据管理器。 - bgusach
很奇怪,但只有在我启动Git Bash(如上所述)时才能正常工作,但如果我继续使用我开始git push的同一终端,则会出现错误 - 它始终抛出相同的错误,即使在终端重新启动后也是如此。但无论如何,还是非常感谢 - 最终它为我节省了很多时间。 - Kostyantyn Didenko
这绝对是我遇到的最好的答案。其他的都很复杂,但这个简单而精确。 - claudekennilol
1
这个只能用一次。当你再次添加账户后,同样的问题会继续发生。 - Megakoresh
显示剩余2条评论

42
你也可以直接切换到https,而不是ssh。如果你使用https,它会遵循.git/config中的设置。所以,在.git/config中更改: url = git@github.com:USER/PROJECT.git 改为 url = https://USER@github.com/USER/PROJECT.git (这些值位于git项目页面上,点击“SSH”和“HTTP”按钮获取新值)。

2
+1!这是一种非常好的解决方案,可以从租借的机器等地方进行一次性推送,其中您不想安装私钥等。 - lambshaanxy
1
我认为使用 https 的唯一问题是每次执行 push 操作时都需要输入用户名/密码,除非有某些我不知道的 Git 配置。 - hellatan
我知道这已经很老了,但是非常感谢你。我的机器没有设置ssh,但它仍然试图将代码推送到我的工作github账户而不是我的个人账户,只是一次性的推送。在我的项目目录中使用了以下内容 .git/config ,效果非常好。太棒了!为你点赞。 - Sady
2
请注意,你也可以这样做:git push https://username:pass@github.com/user/repo.git...如果你不介意把 pass 显示在你的 shell 历史记录中的话。 - Plato
这是最好的解决方案。谢谢! - remy727

38

GitHub通过识别SSH密钥来辨认你的身份,而不是通过Git的任何设置。

因此,在尝试以个人账户推送代码时,需要确保你工作账户的SSH密钥不在你的密钥环中,反之亦然。使用ssh-add -l命令确定哪些密钥在你的密钥环中,并使用ssh-add -d keyfile命令从密钥环中删除一个密钥。

此外,如果你已经配置了~/.ssh/config文件以向GitHub提供特定的SSH密钥,则需要检查该文件。最后,我不知道GitHub如何处理两个帐户具有相同SSH公钥的情况,所以请确保你不这样做。


3
如果必要的话,您还可以使用GIT_SSH环境变量来告诉git使用不同的ssh命令;特别是,您可以让它使用特定的密钥。请查看主git手册,或者可能是这个问题 - Cascabel
如果一个人需要两个钥匙环,比如他们有两个不同的Github账户和不同的SSH密钥,该怎么办? - Brian Holt

14

我曾经也遇到过同样的问题。原来是我在GitHub上有两个账号都使用了相同的SSH密钥,而GitHub默认使用了没有权限访问我所需仓库的错误账户。我从不需要使用的账户中删除了SSH密钥,然后一切都按预期工作了。

你可以测试一下GitHub正在使用哪个账户进行认证:

ssh -T git@github.com

对我来说,一开始显示的是错误的用户名,但是在从那个账户中删除了重复的SSH密钥之后,它就显示了正确的用户名,并且我的拉取和推送到我的 repo 上也顺利进行。


13

最近我也遇到了同样的问题,因为我创建了一个新的GitHub账户。我尝试了上面的答案,但没有帮助。后来我在某个地方看到了一篇关于从Keychain Access(仅在使用mac时)中删除GitHub的帖子。当我git push时,它要求输入用户名和密码,然后它就可以工作了!


@Carpetsmoker,看起来OP正在提供一种适用于Mac的解决方案。 - Zev Spitz
1
请尝试找到原始帖子并添加链接。 - Zev Spitz
1
https://dev59.com/XWgu5IYBdhLWcg3wzKAc - vishnu viswanath

13

我知道这可能有点晚,但我被卡了很长时间,最终是通过以下方式解决的:

示例屏幕截图

  • 进入keychain访问(osX)

  • 搜索git(确保你已选择所有项目)

  • 在这里,你会找到罪魁祸首的凭据。删除它们。

希望这可以帮助到你!


这是唯一帮助了我的答案! - Wilder Pereira
这个答案帮助我解决了Mac中的问题。 - Javascript Hupp Technologies
谢谢 @A.Dev,你救了我的一天。 - Diego Alberto Zapata Häntsch
谢谢你,@A.Dev,你救了我的一天。 - undefined

10

以下是一种方法:您可以为不同的ssh账户使用不同的ssh配置。

更新于2月22日:

请查看此链接:https://gist.github.com/2351996


链接的Gist和Gist页面上的第一条评论对我来说完美地运作了。我认为这比Walter Mundt的答案更优越,因为您可以在钥匙扣上留下多个密钥,一切都“只是工作”。 - keybits

4
如果更改与帐户关联的SSH密钥无效,请更改与该帐户关联的电子邮件。请前往Github>帐户设置>电子邮件,并验证您用于提交的电子邮件地址是否与帐户上的电子邮件匹配。要查看您用于提交的电子邮件地址,运行以下命令:git config --global user.email。如果您需要更改用于提交的电子邮件地址,请运行git config --global user.email“your_email@youremail.com”

3

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