我刚刚启用了 2FA(我想不出我所做的任何其他更改)并且 git 询问我的用户名和密码。我提供了两者,但它们是“错误的”。我在这里尝试了许多解决方案:Git push requires username and password,但没有奏效。特别是当从 https 切换到 ssh 时,ssh 键给出
权限被拒绝(公钥)。致命:无法从远程存储库中读取。
$ git push
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:
git config --global push.default matching
To squelch this message and adopt the new behavior now, use:
git config --global push.default simple
See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)
Username for 'https://github.com': **********
Password for 'https://mlbileschi@github.com':
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/mlbileschi/scala.git/'
有小费吗?
gh
),问题就消失了。首先,使用 the project README 中的说明下载 GH CLI,然后按照 manual 进行身份验证。按照终端中的说明进行操作,当 GH CLI 完成身份验证后,您不再需要 git push
的密码。
端到端解决方案需要 3 个步骤。
感谢 Gergo Erdosi。他的回答基本上是对的,只是 Github 改变了那个设置页面。截至 2016 年底,您需要从个人访问令牌页面生成访问令牌。在命令行中将此访问令牌用作您的密码。您可以通过将用户名包含到您的项目远程 url 中来保留您的用户名。一种方法是编辑您的 .git/config 以将 url 行修改为以下格式: url = https://YOUR_USERNAME_HERE@github.com/owner/repo.git 您可以通过运行此命令来保留您的密码仅限一次:$ git config credential.helper store,然后您未来的 git 密码将使用格式 https://user:PlaintextPassword@example.com 以纯文本形式存储在 ~/.git-credentials 中。以明文形式存储密码通常会被视为安全风险。但在这种 2FA 案例中,凭证不是您的真实密码,它是一个随机生成的字符串。因此,它与使用 ssh 私钥和无密码 ssh 私钥一样安全。警告:请记住,如果您碰巧在这台机器上使用了另一个没有 2FA 的 git 帐户,那么这些真实密码也将以明文形式存储。
PS:或者,您可以选择使用基于 ssh 的登录,使用受密码保护的 ssh 私钥,这会更安全且不太方便,但这超出了此答案的范围。
...the credential is NOT your real password, it is a randomly generated string. So it is as secure as using ssh private key.
— 这根本不是真的。开箱即用的 passphrase 可以轻松保护 SSH 密钥。普通的 ~./git-credentials
— 根本不安全!
您可以设置 SSH 密钥(在 Linux 和 Windows 上)
💡 Windows 用户注意事项确保 HOME 环境变量已定义并设置在您的用户目录中,例如 C:\Users\jossef(了解更多)
1) 生成新的 SSH 密钥 (source)
打开终端 / cmd 并粘贴下面的文本,(替换为您的 GitHub 电子邮件地址)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
2) 将公钥链接到您的 GitHub 帐户
在 Linux / macOS 上,在终端中运行:cat ~/.ssh/id_rsa.pub
在 Windows 上,在 cmd 中运行:键入 %HOME%\.ssh\id_rsa.pub
这将输出公钥:
ssh-rsa AAAAB3NzaC1y ... mKAKw== your_email@example.com
导航到 https://github.com/settings/keys
单击新建 SSH 密钥
给它一个标题
复制粘贴上一个命令输出中的公钥
https://i.stack.imgur.com/gVrFW.png
3) 将 git 来源从 https://
更改为 ssh
打开终端 / cmd 和 cd
到您克隆的存储库目录并运行:
git remote set-url origin git@github.com:<github username>/<repository name>
https
进行身份验证有时很有用,例如,当您的 fork 在 ssh
上保持上游超过 https
时,这样您就可以避免意外推送到上游,因为 https
会要求输入密码并提醒您定位错误的回购
我有一个类似的问题。我必须更改 git 命令中使用的 url 以包含我的用户名。
git push https://YOUR_USERNAME_HERE@github.com/mlbileschi/scala.git
然后,当它要求 PW 时,请使用您按照 Gergo Erdosi 的回答中的说明创建的访问令牌。
git remote set-url --push origin
设置为相同的值,那么 git push origin master
仍然会失败。
git-bash
内部工作正常
如果您已经在使用 ssh 密钥,则在启用 2FA 后,它将强制您使用 SSH 远程读/写。您实际上不需要添加个人令牌,而是继续使用现有的 SSH 密钥对。
只需将您的远程 URL 从 HTTPS 更改为 SSH:
git remote set-url origin git@github.com:<github-username>/<repo-name>
2021 年更新
不确定这是否适用于所有人,但将我的 git version 从 2.27.0 更新到最新版本(当前为 2.30.0)解决了我的问题,同时尝试在命令行中使用个人访问令牌作为密码没有。
更新后,在尝试推送时,系统提示我通过浏览器登录 GitHub,而不是在对话框或命令行中输入我的凭据。
这对我有用:
转到 [your-git-repo]/.git/config
在 [remote "origin"] 下,将 URL 密钥从 http 协议更改为 git。
例子
如果 url
的值为 https://github.com/.git 将其更改为 git@github.com:<repo-url>.git
在 Github 上启用 2FA 后,这对我有用:
创建个人访问令牌:https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line。注意:请记住为令牌选择正确的权限。运行:git clone https://github.com/username/repo.git 用户名:your_username 密码:your_token
进一步阅读:https://help.github.com/en/github/using-git/which-remote-url-should-i-use
当我为我的一个私人存储库启用 2FA(双因素身份验证)时,我在现有存储库中遇到了这个问题。我能够在我的 ubuntu 19.0 终端上按照以下步骤解决它:-
将您的 ssh 密钥添加到 github,这样您就不需要再次使用密码了,因为现在您已经启用了 2FA。访问 github 页面以了解如何轻松完成。添加密钥后,转到您的终端,并更新原始 url git remote set-url origin git@github.com:
就是这样。希望它有所帮助
我在切换到旧笔记本电脑时遇到了这个问题。真正的问题只是我运行的是旧版本的 git。一旦我使用新的跨平台凭证管理器更新到最新版本的 git,它就能够非常好地用 2FA 签署我(看起来它会自动为你创建一个 PAT)。
git pull
的原始目录。可能是本地问题,但这可能会对某人有所帮助。The requested URL returned error: 403
,用于推送 https