我有一些 SSH 密钥,在终端上输入密码后,我成功地用它们连接到一些服务器,特别是推送git
存储库。
我的组织正在测试一个自托管的 GitLab 实例,目前我们无法成功启用 SSH 克隆。我从这个 GitLab 实例的 UI 创建了一个存储库,由于缺少 SSH,因此通过 克隆了它https
。然后我从终端进行了一些更改,提交并尝试推送。我从两台机器进行了测试:
一个(GNU/Linux Debian)远程服务器(我们的服务器),一切运行顺利,
一个(GNU/Linux Mageia 9)本地版本,每次都会弹出以下窗口(
qt5-ssh-askpass
我猜):而且,即使密码正确,由于我们的实例未启用 SSH,因此这显然会失败。第一次失败后,再次出现相同的弹出窗口,出现相同的失败并出现以下错误消息:
远程:HTTP Basic:访问被拒绝。提供的密码或令牌不正确,或者您的帐户已启用 2FA,您必须使用个人访问令牌而不是密码。请参阅https://gitlab.gutenberg-asso.fr/help/topics/git/troubleshooting_git#error-on-git-fetch-http-basic-access-denied。
我的一个朋友在许多不同的机器上尝试了相同的程序,并没有遇到这样的问题。
你明白发生了什么事吗?
答案1
SSH 密钥不能与 HTTP 协议一起使用。
如果您使用 HTTP 而不是 SSH 进行克隆,那么 repo 会将其“远程”设置为使用 HTTP,这意味着任何推送或拉取都将使用该协议。
如果您想使用 SSH 密钥进行身份验证,那么您必须使用 ssh,最简单的方法是使用 SSH 进行克隆。
如果 SSH 无法运行,则需要使用用户密码进行身份验证。这可能需要在 GitLab 设置中启用,我不熟悉 GitLab,只熟悉 git。
答案2
Git 支持多种提示用户的方式,包括使用与 SSH 相同的协议的 askpass 助手。这是因为 Git 可能在用户只有图形界面的后台运行(这在 Windows 上尤其常见,但不限于该平台)。askpass 助手会收到一个文本提示,它会将其显示给用户。
如果设置了环境变量,则设置 askpass 帮助程序GIT_ASKPASS
(在这种情况下,采用程序名);SSH_ASKPASS
如果未设置环境变量,则设置环境变量;否则,core.askPass
设置配置值。
听起来这里发生的情况是,您配置了一个 askpass 帮助程序(我猜是使用SSH_ASKPASS
),但它错误地显示了静态提示而不是给定的提示。如果是这种情况,您实际上需要在此处提供个人访问令牌,这应该会导致成功推送(前提是它具有正确的范围)。
如果您希望在命令行中看到提示,您可以取消设置相应的环境变量和配置选项,然后您将看到提示。请注意,如果您还没有配置了凭证助手,您可能希望这样做,这样您就不需要每次都输入您的 PAT。