Git使用错误的电子邮件进行推送

时间:2018-08-29 15:28:15

标签: git github

好的,这很烦人,我不知道怎么了。

我的笔记本电脑上有2个github帐户-用于工作和个人项目。

我已经将个人电子邮件设置为全局配置,然后在我从事工作项目时就将工作电子邮件设置为git config电子邮件。

我的问题是,出于某种奇怪的原因,当我推送但当我通过在个人项目的根目录中运行以下代码进行检查时,git现在将我的工作电子邮件用于个人项目之一:

git config user.email

打印的电子邮件是我的个人项目!

我尝试进行推送时的错误代码是:

remote: Permission to personal_github_username/personal_project.git denied to work_github_username
fatal: unable to access 'https://github.com/personal_github_username/personal_project.git/': The requested URL returned error: 403

这是另外一件奇怪的事情:我可以使用Github Windows客户端进行推送,但不能使用Git GUI进行推送。

在这一点上,我不知道该怎么办,我宁愿不删除本地存储库,而再次从远程存储库克隆。任何帮助或尝试将不胜感激。

2 个答案:

答案 0 :(得分:2)

TL; DR

您需要切换凭据。从VonC's answer here开始。

发生了什么

在此处特别注意URL:

  

...无法访问“ https://github.com/...

从此开始:git push不使用您配置的user.email!它使用您提供的URL,通常通过诸如origin之类的远程名称:存在一个设置remote.origin.url来保存URL。

URL本身以各种“方案”名称之一开头,例如ssh://https://。在双斜杠后面是一个主机名,从技术上讲,它可以包含user:password@host.dom.ain,但不要这样做。最多放入user@host.dom.ain中,然后将其余字符串提供给该主机。或者,您可以使用git@github.com:path/to/repo的缩写,ssh://git@github.com/path/to/repo

自您特别要求https以来,Git将从凭据帮助器获取用户名和密码。 Git使用的特定凭据帮助程序取决于很多事情。依次最重要的是以下两个:

  • 您的主机操作系统是什么? Windows具有Windows特定的凭据帮助器,OS X具有基于osx-keychain的帮助器,其他具有storecache帮助器。

  • 您正在使用哪个版本的Git?几乎所有现代版本都比古代版本要好得多,但是仍然有一些古老(1.7和1.8早期)的Git版本仍在使用。

有关使用HTTPS时凭据帮助器的更多信息,请参见Is there a way to skip password typing when using https:// on GitHub?。我注意到您已添加:

  

这是另外一件奇怪的事情:我可以使用Github Windows客户端进行推送,但不能使用Git GUI进行推送。

这意味着您正在使用Windows(我避免使用...)。显然,他们的Github Windows客户端使用的凭据帮助程序不同于Git GUI。

我更喜欢使用SSH,这意味着我设置了ssh密钥并将URL设置为使用ssh://git@github.com/...。使用SSH时,GitHub最终会查找公钥,您的SSH客户端(即您的Git)发送来查找谁正在连接,然后使用它来执行以下操作:确定您是谁以及是否可以访问该存储库。

那么您的user.email在哪里被使用?

一旦您的Git获得授权并成功与GitHub上的另一个Git对话,您的Git就会推送 commits 。提交本身(在运行git push之前的某个时刻已经完成)包含从user.nameuser.email设置派生的字符串。

使用git commitgit push设置的是user.name,而不是user.email。这些只是配置设置,不是凭据。

换句话说,到您运行git push时,它已经超过了Git查看您的user.email设置的时间。您现在设置的内容不再重要。过去设置的内容只有且仅当您推送使用其设置的某些提交时才重要。

答案 1 :(得分:0)

有趣。好吧,让我们尝试重做设置。 请执行以下操作,为所有git设置默认用户信息。

$ git config --global user.name "John Doe"
$ git config --global user.email john.doe@gmail.com

现在转到工作git并使用--local标记ovverride全局设置,以便对于该特定项目,它改为使用您的工作信息(注意:对于每个工作git,您都必须这样做):

$ git config --local user.name "John Doe"
$ git config --local john.doe@work.com

希望有帮助!