GitHub: 用户名或密码无效

680

我有一个托管在GitHub上的项目。当我试图将我的修改推送到主分支时,失败了。我总是收到以下错误消息:

Password for 'https://git@github.com': 
remote: Invalid username or password.
fatal: Authentication failed for 'https://git@github.com/eurydyce/MDANSE.git/'

然而,将我的ssh密钥设置到github上似乎没问题。事实上,当我执行ssh -T git@github.com时,我会得到以下结果:

Hi eurydyce! You've successfully authenticated, but GitHub does not provide shell access.

这似乎表明从那一侧来看一切都没问题(eurydyce是我的Github用户名)。我严格按照Github的说明和许多堆栈讨论的建议进行操作,但无济于事。你有任何想法我可能做错了什么吗?


2
我不确定是否应该发布答案(很有可能会被踩),因为在尝试了多次使用“正确”的密码(通过检查元素进行验证)后,我通过更改Github设置中的密码解决了此错误消息。 - 林果皞
2
一些组织启用了SAML SSO。在这种情况下,最好使用个人访问令牌。如果您已经登录,请重新登录并授予Github Desktop / Sourcetree权限。 - Abhay Shiro
36个回答

1487

启用双重认证(2FA)后,当尝试使用git clonegit fetchgit pullgit push时,您可能会看到类似于以下内容:

$ git push origin master
Username for 'https://github.com': your_user_name
Password for 'https://your_user_name@github.com': 
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/your_user_name/repo_name.git/'

为什么会发生这种情况

根据GitHub帮助文档

启用两步验证后,您需要输入个人访问令牌而不是 2FA 代码和 GitHub 密码。

...

例如,当您使用 Git 命令行访问存储库,使用诸如 git clonegit fetchgit pullgit push 的命令与 HTTPS URL 一起使用时,在提示输入用户名和密码时,您必须提供 GitHub 用户名和个人访问令牌。命令行提示不会指定在要求输入密码时应输入个人访问令牌。

如何修复

  1. 生成个人访问令牌(有关详细信息,请参见为命令行创建个人访问令牌)。
  2. 复制个人访问令牌。
  3. 重新尝试您想要运行的命令,并在密码位置使用个人访问令牌。

相关问题:https://dev59.com/_2Ei5IYBdhLWcg3w0fFR#21374369


28
Kudo和Upvote;新的令牌生成是我所需要的。此外,“复制代码”中包含了额外的(无效)字符,因此我不得不手动输入我的......20[?]位随机密钥。 - th3byrdm4n
23
这是我的问题,在添加了两步验证后,我怀疑是它的原因,但相关文档不够详细。感谢您的答复! - Pogrindis
13
@BeauSmith:这次编辑比我们通常允许的要更为实质性。你基本上完全重写了这个答案。请将其作为你自己的,独立的答案发布。另请参阅如果有人基本上重写了整个答案,该怎么办? - Martijn Pieters
13
编辑在这里...由于似乎标记此答案为正确的人(包括我自己)访问此页面是针对略有不同于提问者意图的问题,我试图添加一些“谷歌优化”术语并使答案更具视觉吸引力,以便寻找此解决方案的其他人可以找到它。努力改善社区。 - Beau Smith
8
当用户在其账户上启用双重认证时,GitHub 应更清晰地说明此通知。这是一个致命错误。 - Nick Song
显示剩余12条评论

416

https://git@github.com/eurydyce/MDANSE.git 不是一个ssh url,而是https url(需要您的GitHub账户名,而不是"git")。

请尝试使用ssh://git@github.com:eurydyce/MDANSE.git或者只使用git@github.com:eurydyce/MDANSE.git

git remote set-url origin git@github.com:eurydyce/MDANSE.git

OP Pellegrini Eric表示:

这就是我在我的~/.gitconfig文件中所做的,它目前包含以下条目:[remote "origin"] url=git@github.com:eurydyce/MDANSE.git

这不应该出现在您的全局配置文件(即位于~/的文件)中。
您可以在存储库中检查git config -l:该URL应在本地配置文件中声明:<yourrepo>/.git/config

因此,在执行git remote set-url命令时,请确保您处于存储库路径中。


正如Oliver答案中所指出的那样,如果激活了双重身份验证(2FA),HTTPS URL将不使用用户名/密码。

在这种情况下,密码应该是PAT(个人访问令牌),如“在命令行上使用令牌”中所示。

这仅适用于HTTPS URL,SSH不受此限制。


哎呀!你说得对,我在本地配置中进行了这些更改后,一切都正常了。非常感谢。 - Eurydice
240
完全不理解这个答案的意思。 - Cloud
3
@Clo sure,哪个部分缺乏清晰度,我该如何改进这个答案? - VonC
@AaronFranke 用户名/密码是指 HTTPS URL,而不是 SSH。 - VonC
1
如果这是SSH,那就意味着你有一个 ~/.ssh/config%USERPROFILE%\.ssh\config 文件,并且其中有一个 github.com 的条目。 - VonC
显示剩余5条评论

143

针对Windows用户的解决方案:

  1. 打开控制面板
  2. 选择凭据管理器
  3. 点击Windows凭据
  4. 在通用凭据部分,会有git url,请更新用户名和密码
  5. 重新启动Git Bash并尝试克隆

注意: 如果在通用凭据部分没有找到git url,请参照下面的答案: https://dev59.com/cl4b5IYBdhLWcg3wVwFi#55858690


5
我遇到了使用公司版本的GitHub(因此需要本地用户名和密码)的问题,这个解决方案解决了它。 - mkennedy
1
在新的Windows系统中,您可以搜索“Windows凭据”或类似的词语以获取解决方案。它会弹出一个结果,您可以尝试这个解决方案。 - Charles Tempo
2
完美的解决方案适用于在公司强制使用https的本地GitHub。 - avi.elkharrat
我一直在跟随另一个线程来刷新凭据,但没有成功。你的解决方案完美地解决了这个问题。 - Heinz
相同问题:git@github.com:Permission denied(publickey)。 致命错误:无法从远程存储库读取。请确保您拥有正确的访问权限并且存储库存在。 - Thirsty Six

82
如果像我一样刚更新完密码并运行了git push遇到了这个问题,那么有一个非常简单的解决方法。
仅适用于Mac用户。 您需要删除GitHub的OSX Keychain访问条目。 您可以通过终端运行以下命令来执行此操作。
通过命令行,您可以直接使用凭据助手来擦除钥匙串条目。
要执行此操作,请输入以下命令:
git credential-osxkeychain erase
host=github.com
protocol=https

# [Now Press Return]

如果成功了,就不会打印出任何东西。为了测试它是否有效,请尝试从GitHub克隆存储库或像我一样再次运行您的上一个操作 git push。如果提示输入密码,则表示钥匙串条目已被删除。


3
针对Windows系统: git credential-wincred erase host=github.com protocol=https - Juan Uribe
我在一个 BitBucket 仓库上遇到了这个问题。使用 host=bitbucket.org 而不是 GitHub 的答案解决了我的问题。 - gutch
我在更改Github密码后,git pull对我不起作用了。以下方法对我奏效。 - Gokul
这是正确的答案,如果有人在最后一次Github身份验证更新后被卡住了,需要使用用户名/令牌而不是用户名/密码进行登录。 - Ibrahim.H
太好了,这正是我需要的,以便用新的令牌替换过期的令牌。谢谢。 - CharlesC

41

除了使用 git pull,也可以尝试使用 git pull origin master

我修改了密码,第一个命令报错了:

$ git pull
remote: Invalid username or password.
fatal: Authentication failed for ...

执行git pull origin master之后,它要求输入密码并似乎更新了自己。


1
这正是我所需要的! - Yogesh D
3
这是最简单的方法,它有效! - wingsforever

38

如果使用 https:// URL 连接到远程仓库,Git 将不会使用 SSH 作为身份验证方式,而是尝试通过 HTTPS 进行基本身份验证。通常情况下,您只需使用不带用户名的 URL,例如 https://github.com/username/repository.git,然后 Git 将提示您输入用户名(您的 GitHub 用户名)和密码。

如果您使用 https://something@github.com/username/repository.git,那么您已经预设了 Git 用于身份验证的用户名:something。由于您使用了 https://git@github.com,Git 将尝试使用 git 用户名登录,而您的密码当然不起作用。所以您需要使用 您自己的 用户名。

另一种选择实际上是使用 SSH 进行身份验证。这样,您就可以避免一直输入密码;而且既然似乎已经可以工作了,那么就应该使用它。

要做到这一点,您需要更改远程 URL,以便 Git 知道它需要通过 SSH 连接。格式如下:git@github.com:username/repository。要更新您的 URL,请使用以下命令:

git remote set-url origin git@github.com:username/repository

当我尝试您的命令时,会得到以下警告信息:“warning: remote.origin.url has multiple values”。这可能是因为我已经在我的~/.gitconfig文件中有一个远程标签,其中包含值[remote "origin"] url=git@github.com:eurydyce/MDANSE.git - Eurydice
我已经搜索了几个小时,想知道为什么我无法推送我的更改,这个答案终于给出了完美的解释,并帮助我解决了问题,谢谢! - Sander Lam

32

启用了2FA并遇到错误 远程:无效的用户名或密码。致命错误:身份验证失败

如果您在GitHub上启用了2FA,您需要输入个人访问令牌而不是2FA代码和GitHub密码。

如何解决此问题

  1. https://github.com/settings/tokens 生成令牌
  2. 复制个人访问令牌
  3. 现在在git操作期间将个人访问令牌输入密码位置

这就是了!你能解释一下这里正在发生什么吗?从现在开始,我是否需要token来进行任何与Github相关的操作? - Yashank
1
在此之后,接着遵循@Anil_Reddy的答案。 - Magne

27

只需再次尝试将其推送到您的分支即可。这会再次要求您输入用户名和密码,因此您可以输入更改后的密码。这样,您的新密码将再次存储在缓存中。


5
不确定为什么这个回答会被踩。在我的情况下,我的凭据已经更新,第二个 git push 提示进行适当的更新,正如这个答案所指出的那样。 - Digital Trauma
不确定您的意思,执行 git push origin master 不会要求新的凭据... - Betlista
不错!如果你尝试 git clone 一些东西,但它告诉你你的用户名/密码不正确,也是同样的情况。如果其中任何一个最近更改了,只需再次运行 git clone <myprojecturl>,这次它会要求您重新输入用户名和密码。 - Kyle Vassella
非常奇怪,为什么第一次失败了但第二次却成功了。(Vscode扩展完成了这项工作) - KansaiRobot

18

这对我很有效,但运行 git remote -v 后,我注意到我的仓库使用 HTTPS 进行获取和推送,而我以为它使用 SSH。如果您已经有 SSH 身份验证(请使用 ssh -T git@github.com 进行测试),那么您应该能够将 URL 设置为 SSH 地址。查找 SSH URL 的简单方法是转到 GitHub.com 上的存储库,然后单击绿色“Code”按钮的“SSH”选项卡并复制链接。然后在存储库中运行以下命令:git remote set-url origin git@github.com:your-user-or-org/your-repo-name.git(用您复制的链接替换最后一部分)。 - Kerry Johnson

17

我使用了以下命令成功了。

git config --unset-all credential.helper
git config --global --unset-all credential.helper
git config --system --unset-all credential.helper

在此之后,在任何存储库中执行 git push origin master 都应该再次提示您输入用户名(与之前相同)和密码(在此处使用个人访问令牌)。 - Magne

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