git 克隆远程仓库时默认使用 gnutls,正常情况下没有任何问题。当使用 gitlab 时,如果把 gitlab 放在代理后面(如:放在 nginx 后面),则可能会出问题。例如报错:gnutls_handshake() failed: Handshake failed
。此时可以通过自己编译使用 OpenSSL 的 git 来解决这个问题。
上面的问题已经确定,报错是因为 nginx 配置 SSL 时允许的加密算法和 git 客户端使用的加密算法不一致导致。低版本 git 客户端可能会使用 RC4-SHA
算法,但由于这个算法本身强度不够,一般 nginx 配置中都不会使用 RC4-SHA
。
环境准备
apt install -y build-essential
apt install -y libcurl4-openssl-dev
# 安装其他编译依赖
apt-get build-dep git
编译 git
# 克隆源代码
git clone git@github.com:git/git.git
cd git
# (可选)删除老版本 git
apt remove git*
make configure
# 指定要安装到的位置
./configure --prefix=/usr
# 编译源代码和文档。如果不需要文档,则删除 doc
make all doc
# 安装到指定位置。如果不需要文档,则删除 install-doc
make install install-doc