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

zer*_*ero 6 git github

好吧,这很烦人,我无法弄清楚出了什么问题。

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

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

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

git config user.email
Run Code Online (Sandbox Code Playgroud)

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

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

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
Run Code Online (Sandbox Code Playgroud)

这里还有一件奇怪的事情:我可以使用 Github Windows 客户端进行推送,但我无法使用 Git GUI 进行推送。

此时,我不知道该怎么办,我宁愿不删除本地存储库并从远程存储库中再次克隆。任何帮助或尝试将不胜感激。

tor*_*rek 7

TL; 博士

您需要切换凭据。从VonC 的回答开始

这是怎么回事

特别注意这里的 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 时凭据帮助程序的(更多)更多信息,请参阅在 GitHub 上使用 https:// 时是否可以跳过密码输入? 我注意到你补充说:

这里还有一件奇怪的事情:我可以使用 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 commit,不是git push,使用user.nameuser.email设置。这些只是配置设置,而不是凭据。

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


Gri*_*ave 6

到目前为止,这里的答案都没有提到一个关键方面。

也就是说,您进行了提交,然后更改了地址设置。需要反过来才能将正确的地址记录到提交中并在推送之前。

因此,在更改存储库的电子邮件地址后,您必须撤消并重做您的提交:

git log  # to see recent history
git reset --soft HEAD~1  # to roll back
git status
git add .
git commit -m "same message"

git log 
git push
Run Code Online (Sandbox Code Playgroud)