Git clone / pull 不断冻结在“将密钥存储在缓存中?”

Posted

技术标签:

【中文标题】Git clone / pull 不断冻结在“将密钥存储在缓存中?”【英文标题】:Git clone / pull continually freezing at "Store key in cache?" 【发布时间】:2016-01-19 07:38:27 【问题描述】:

我正在尝试将存储库从我的 BitBucket 帐户克隆到我的 Windows 10 笔记本电脑(运行 GitBash)。我已经完成了连接所需的所有步骤(设置我的 SSH 密钥,通过成功 SSH 验证 git@bitbucket.org 等)。但是,每当我尝试克隆存储库时,在确认我要缓存 Bitbucket 的密钥后,提示会不断挂断。

User@Laptop MINGW64 /C/Repos
$ git clone git@bitbucket.org:mygbid/test.git
Cloning into 'test'...
The server's host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server's rsa2 key fingerprint is:
ssh-rsa 2048 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40
If you trust this host, enter "y" to add the key to
PuTTY's cache and carry on connecting.
If you want to carry on connecting just once, without
adding the key to the cache, enter "n".
If you do not trust this host, press Return to abandon the
connection.
Store key in cache? (y/n) y

没有文件被克隆,结果是一个空的 repo。尝试从此 repo 启动 git pull origin master 也要求缓存密钥,然后挂起而没有反馈。尽管我在测试 SSH 时没有要求缓存密钥,但 git 操作每次失败前总是要求提供密钥。

没有错误消息可以处理,我真的不知道出了什么问题。我尝试了多个仓库,包括非常小的仓库,但都没有成功。

【问题讨论】:

【参考方案1】:

我在 Windows 10 上克隆 repo 时也遇到了这个问题。

我通过使用 Putty GUI SSH 到有问题的服务器(在您的情况下:bitbucket.org)解决了这个问题,然后在提示询问您是否要将服务器密钥保存到缓存时单击“是”。再次运行克隆命令对我有用!

【讨论】:

这并没有直接为我解决这个问题,但它让我意识到问题与 GitBash 使用 Putty 进行 ssh 身份验证而不是 OpenSSH 有关。当我删除 GIT_SSH 系统变量并重置 GitBash 时,一切正常。谢谢! 使用putty 在缓存中添加github 键对我有用 这在 Win 7 上使用命令控制台对我有用。我希望有人能告诉我为什么会发生这种情况,而不仅仅是一种解决方法。 任何人都可以告诉如何做上述解决方案 @Shreyan Mehta 只需打开腻子,在主机名下粘贴 git@github.com(或您使用的任何主机)。请务必选择 SSH 的连接类型。端口号应为 22。另外,请确保在启动之前将 ssh 密钥加载到选美中。【参考方案2】:
    打开腻子 输入主机名(如bitbucket.org) 点击打开 在弹出窗口中单击“是”以缓存主机密钥 关闭腻子

【讨论】:

我遇到了同样的问题。查看 git 的输出,似乎 git 无法缓存主机密钥(可能是一个错误)。所以你必须使用 PuTTY GUI 来完成。 我尝试了所有步骤,但是当我选择“y”或“n”时,Git Bash 什么也没做 您是否在第 2 步中输入了正确的主机名?您是否尝试重新启动 Git Bash? 这与接受的答案有何不同? 我对这个答案投了赞成票,因为它提供了步骤。我不喜欢它是一种解决方法(您必须为连接的每个 SSH 服务器重复此操作),就像接受的答案一样。【参考方案3】:

我设法通过直接运行 plink 使其工作,在选美运行后直接使用 plink 命令 - plink.exe -agent -v git@github.com 然后在此 git 工作后不挂起。

【讨论】:

不错的解决方案!这应该标记为答案 这是最好的答案。 我认为这不是一种解决方法,这是正确的解决方案 如果您在使用 github 时遇到此问题,在使用您的密钥运行选美时在 dos 提示符下准确键入该命令可以解决此问题。我同意这是最好的答案! 这成功了。注册表中的值具有不同的格式,因此您也应该知道它。我遇到了挂在上面的 Tortoise GIT 对话框的问题,虽然我尝试通过 Windows 命令行推送,但效果不佳。确实不错的解决方案!【参考方案4】:

要从 powershell 执行此操作,请打开一个 powershell 窗口并粘贴以下内容:

echo y | & 'C:\Program Files (x86)\GitExtensions\PuTTY\plink.exe' -ssh git@github.com
echo y | & 'C:\Program Files (x86)\GitExtensions\PuTTY\plink.exe' -ssh git@gist.github.com
echo y | & 'C:\Program Files (x86)\GitExtensions\PuTTY\plink.exe' -ssh git@bitbucket.org

或使用 PuTTY 独立版本:

echo y | & 'C:\Program Files (x86)\PuTTY\plink.exe' -ssh git@github.com
echo y | & 'C:\Program Files (x86)\PuTTY\plink.exe' -ssh git@gist.github.com
echo y | & 'C:\Program Files (x86)\PuTTY\plink.exe' -ssh git@bitbucket.org

另外值得知道的是腻子stores known hosts under a registry key:

HKEY_CURRENT_USER\SoftWare\SimonTatham\PuTTY\SshHostKeys

要快捷方式,您可以将以下内容放入.reg 文件并运行它:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\SimonTatham\PuTTY\SshHostKeys]
"rsa2@22:github.com"="0x23,0xab603b8511a67679bdb540db3bd2034b004ae936d06be3d760f08fcbaadb4eb4edc3b3c791c70aae9a74c95869e4774421c2abea92e554305f38b5fd414b3208e574c337e320936518462c7652c98b31e16e7da6523bd200742a6444d83fcd5e1732d03673c7b7811555487b55f0c4494f3829ece60f94255a95cb9af537d7fc8c7fe49ef318474ef2920992052265b0a06ea66d4a167fd9f3a48a1a4a307ec1eaaa5149a969a6ac5d56a5ef627e517d81fb644f5b745c4f478ecd082a9492f744aad326f76c8c4dc9100bc6ab79461d2657cb6f06dec92e6b64a6562ff0e32084ea06ce0ea9d35a583bfb00bad38c9d19703c549892e5aa78dc95e250514069"
"rsa2@22:gist.github.com"="0x23,0xab603b8511a67679bdb540db3bd2034b004ae936d06be3d760f08fcbaadb4eb4edc3b3c791c70aae9a74c95869e4774421c2abea92e554305f38b5fd414b3208e574c337e320936518462c7652c98b31e16e7da6523bd200742a6444d83fcd5e1732d03673c7b7811555487b55f0c4494f3829ece60f94255a95cb9af537d7fc8c7fe49ef318474ef2920992052265b0a06ea66d4a167fd9f3a48a1a4a307ec1eaaa5149a969a6ac5d56a5ef627e517d81fb644f5b745c4f478ecd082a9492f744aad326f76c8c4dc9100bc6ab79461d2657cb6f06dec92e6b64a6562ff0e32084ea06ce0ea9d35a583bfb00bad38c9d19703c549892e5aa78dc95e250514069"
"rsa2@22:bitbucket.org"="0x23,0xb9b88df3578371a7eb80c78bcda14fb30da436f11ca932a5fd5a8b6adfcc681df7a59cb4cb7ac966d9eac11daa38ebdbc0a6582a210ed4ee95a8d101c4abc925e942ab47535d64f9a5b3b68035c2ea1e900d709a1e8ea938718f532f9805a190446b92bac3040126225ae9d8374bc2008f106979d631734c7453f78c70091f4783b288869cb3c1941a784cd9baad823be27333833dc1f488a45b85952be75cf0a64965662302e3915378dcd5cfcd3ec903d804a29dff2fdf19df5deba4534b09e4dea6e44f152e339b3c43be98ddadfc56533192e216a3d673f00b4aa9cc9e7870acd8b6adb7e0feb77f2292fc2dede94819def3eb1e785541a06ab31ccf725f"

putty-hosts.reg gist

【讨论】:

另见之前关于 plink 这方面的问答:serverfault.com/questions/420526/… FATAL ERROR: Disconnected: No supported authentication methods available (server sent: publickey) 如果您的遥控器在 22 以外的端口上运行,您需要通过传递 -P <port> 参数来使用该端口运行 plink。【参考方案5】:

为了解决这个问题,我将 GitBash 配置为使用带有 -batch 选项的 plink。该选项禁用所有提示 - plink 将终止而不挂起,并且不会将任何密钥指纹添加到缓存。

要在 GitBash 执行的 plink 命令中添加 -batch 参数,您可以设置一个 git config 选项:

git config --global core.sshCommand "plink -batch"

或者设置GIT_SSH_COMMAND环境变量。

从未知主机克隆 repo 时的输出将类似于:

The server's host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server's rsa2 key fingerprint is:
ssh-rsa 2048 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40
Connection abandoned.
fatal: Could not read from remote repository.

在此消息之后,您可以使用命令添加一个键来缓存:

echo y | plink git@bitbucket.org

REMARK:请检查您的PATH中是否有plink。或者在 GitBash 配置选项中使用类 UNIX 路径,例如:

/c/Program\ Files/PuTTY/plink.exe -batch

【讨论】:

您好,我收到此消息:致命错误:已断开连接:没有可用的支持身份验证方法(服务器发送:公钥) @pungggi,如果你在 GPG 中管理 SSH 密钥,那么这可能意味着 gpg-agent 没有启动。预先运行gpg-connect-agent /bye【参考方案6】:

即使在执行其他答案中提到的解决方法后,您也可能会遇到如下错误:

致命错误:已断开连接:没有可用的受支持的身份验证方法(服务器发送:公钥)

要同时解决这两个问题,请将以下内容添加到您的 ~/.profile 文件 (C:\Users\<Username>\.profile) 中,将 git bash 更改为使用 SSH 而不是 PuTTY。如果您还没有此文件,请使用此行创建一个新文件。

GIT_SSH="/usr/bin/ssh.exe"

然后打开一个新的 git bash 窗口并再次尝试您的 git clonegit pull

请注意,如果您还没有 SSH 密钥,这可能需要您创建一个。为此,请按照Bitbucket 网站上的说明进行操作。

相关信息请见this SO question。

【讨论】:

【参考方案7】:

在您的 git bash shell 中,检查 GIT_SSH 是否存在: echo $GIT<tab><tab> 如果存在并且设置为putty,执行: unset GIT_SSH 您可能希望将其放入 git bash 启动脚本之一。 这不是一个通用的解决方案。它适用于我们的特定案例。

【讨论】:

“git bash 启动脚本”是什么/在哪里?我只熟悉真正的linux。 有多个启动脚本。有些位于 /etc 目录中;其他人可以在您的主目录中。执行哪些启动脚本取决于 shell 的命令行选项(交互式与登录)。无论 shell 在哪个操作系统上运行,这些都是相关的。 Windows 没有“/etc”目录。 在 Windows 下运行的 Bash shell 可以。它们通常映射到 shell 的基本(或安装)目录之外的某个地方。看看 git bash 和 Cygwin bash。请记住,这些 shell 在外观和操作上都非常类似于 linux 系统上的 shell。【参考方案8】:

这听起来有点傻,但是在尝试了以上所有方法之后,我决定使用默认选项重新安装 Git Bash,并且它成功了。

【讨论】:

【参考方案9】:

如果您使用KiTTY(而不是 PuTTY),则它具有-auto-store-sshkey argument。

因此,您可以将GIT_SSH_COMMAND(或git config --global core.sshCommand)设置为c:/KiTTY/klink.exe -auto-store-sshkey

输出仍然包含有关新密钥和问题的信息,但它不等待答案:

The server's host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server's ssh-ed25519 key fingerprint is:
ssh-ed25519 255 2e:65:6a:c8:cf:bf:b2:8b:9a:bd:6d:9f:11:5c:12:16
If you trust this host, enter "y" to add the key to
PuTTY's cache and carry on connecting.
If you want to carry on connecting just once, without
adding the key to the cache, enter "n".
If you do not trust this host, press Return to abandon the
connection.
Store key in cache? (y/n)
Autostore key is on

【讨论】:

以上是关于Git clone / pull 不断冻结在“将密钥存储在缓存中?”的主要内容,如果未能解决你的问题,请参考以下文章

Git教程 git pull 和 git clone的区别

Git fetch/pull/clone 在接收对象时挂起

GIT:fork和clone的区别,fetch与pull的区别

差异:git clone , git fetch, git pull和git rebase

Git 常用操作 - git clone/git checkout -b/git diff/git push/git pull

Git 常用操作 - git clone/git checkout -b/git diff/git push/git pull