修复 git clone 问题: gnutls_handshake() failed
内容提要
在使用wsl内的git pull命令时,出现了gnutls_handshake()失败的错误。经过诊断发现,网络连接出现问题。尝试重新编译git并安装依赖后,问题得到解决。
延伸解读
错误根源:网络连接问题
文章通过 GIT_CURL_VERBOSE=1 诊断发现,错误发生在与 spacevim.org 建立 TLS 握手时,日志显示 IPv6 地址不可达,IPv4 连接后 GnuTLS 握手失败。这指向网络连接问题,而非 Git 本身缺陷。更换为 GitHub 或 GitLab 地址后正常,进一步印证了特定远程主机的网络连通性异常。
解决思路:重编译 Git 并切换 SSL 后端
作者选择删除现有 Git,下载源码重新编译,并在 configure 时指定 --with-openssl,将 SSL 后端从 GnuTLS 切换为 OpenSSL。同时安装 libcurl4-openssl-dev 等依赖。这一做法可能绕过原 GnuTLS 握手失败的问题,但需注意编译安装步骤较复杂,且可能影响系统包管理。
诊断命令的实用价值
GIT_CURL_VERBOSE=1 能输出详细的 HTTP 连接过程,帮助定位是 DNS、TCP 连接还是 TLS 握手阶段出错。本例中日志清晰显示 IPv6 不可达、IPv4 连接成功但 GnuTLS 握手失败,为后续重编译决策提供了依据。读者遇到类似问题时,可优先使用该命令获取线索。
Q&A
git pull 时出现 gnutls_handshake() failed 错误是什么原因?
根据文章,该错误是由于网络连接问题导致的。当远程地址设置为 https://spacevim.org/git/repos/SpaceVim/ 时,git pull 失败并报错 gnutls_handshake() failed: Error in the pull function。
如何诊断 gnutls_handshake() failed 错误?
可以使用 GIT_CURL_VERBOSE=1 git pull 命令来诊断网络连接问题。该命令会输出详细的网络连接信息,帮助定位问题。
为什么 git pull 在 github 或 gitlab 地址下正常,但在 spacevim.org 下失败?
文章指出,当远程地址恢复为 github 或 gitlab 时,git pull 可以正常执行,而使用 spacevim.org 地址时出现 gnutls_handshake() 失败。这表明问题可能与特定主机的网络连接有关。
如何通过重新编译 git 解决 gnutls_handshake() failed 错误?
文章中的解决步骤包括:删除已有 git,下载 git 源码,安装依赖包,然后使用 make configure、./configure --prefix=/usr --with-openssl 和 make -j4 进行编译和安装。
重新编译 git 需要安装哪些依赖包?
需要安装的依赖包包括:curl、jq、build-essential、autoconf、dh-autoreconf、libcurl4-openssl-dev 和 gettext。
编译 git 时如何指定使用 openssl?
在编译 git 时,使用 ./configure --prefix=/usr --with-openssl 命令来指定安装路径和使用 openssl。