重新编译Git使用openssl替换GnuTLS

在GitHub上,下载较大Git库时,会经常在等待许久之后,出现:

error: RPC failed; curl 56 GnuTLS recv error (-110): The TLS connection was non-properly terminated

一般的解决思路,是加一个参数,让这个仓库小一些。 但这样也只是治标不治本,对更大的仓还是无力。

git clone --depth=1 ...

通过以openssl方式,而非GnuTLS方式,可以绕过此问题。 这需要重新编译git

下载git源码

在GitHub上,git/git本身就是一个大型Git仓库。 如果直接就能clone下来,那这个环境也就不需要重新编译git了。 所以需要想一些别的办法,把git/git弄到手。

下载源码包

wget https://github.com/git/git/archive/v2.26.0.zip
unzip v2.26.0.zip

由于GitHub的这类源码包,也是托管在国外,所以也有下载不了的可能。 以前是托管在AWS上,现在卖身微软,换成了codeload.github.com,估计是Azure的服务吧。 在网速过慢的情况下,超时后可能被服务端拒绝传输,并且无法断点续传。 总之,仍然是需要过墙手段。

下载Git库

虽然无法直接对git/git下手,但是可以通过Gitee,同步一个镜像,再从Gitee下载。 比如,孤做了个镜像yanqd0/git

git clone https://gitee.com/yanqd0/git.git

这个速度还可以。

编译准备

除了编译器之外,Git还依赖于一些库。 直接编译,会出现各种错误。 比如:

$ make
GIT_VERSION = 2.18.0
    * new build flags
    CC credential-store.o
In file included from cache.h:4:0,
                 from credential-store.c:1:
git-compat-util.h:283:25: fatal error: openssl/ssl.h: No such file or directory
compilation terminated.
Makefile:2260: recipe for target 'credential-store.o' failed
make: *** [credential-store.o] Error 1

或者:

$ make
    SUBDIR git-gui
    MSGFMT po/pt_pt.msg Makefile:252: recipe for target 'po/pt_pt.msg' failed
make[1]: *** [po/pt_pt.msg] Error 127
Makefile:1955: recipe for target 'all' failed
make: *** [all] Error 2

需要在编译前,安装:

sudo apt install build-essential tcl-dev libssl libcurl4-openssl-dev gettext

编译安装

make
make install

然后新的git就在~/bin/git位置了。

一般不建议在系统的位置/usr下,直接安装从源码编译的东西。 如果需要改到其它位置,比如~/.local/bin/下,则需要从configure开始。

make configure
./configure --prefix=$HOME/.local
make -j8
make install

参考


相关笔记