CentOS 7 上给 Gitea 配 Git 2.x:源码编译踩坑记录
Gitea 要求 git 版本不低于 2.0,而 CentOS 7 的官方源里最高只有 1.8.3.1,第三方源现在基本都失效了。剩下两条路:装 Docker 跑,或者源码编译。机器只有 2G 内存还有别的服务在跑,编译是更省资源的选择。
先确认编译环境
CentOS 7 的默认 GCC 是 4.8.5,glibc 2.17,这两个版本决定了能编到哪个版本的 git。依赖方面至少要装:
yum install -y gcc make autoconf openssl-devel zlib-devel \
libcurl-devel expat-devel perl-devel gettext-devel
三次失败
第一次,git 2.51:编译到一半报 fatal error: sys/random.h: No such file or directory。这个头文件是 glibc 2.25 之后才有的,2.17 上根本不存在,新版 git 用了 getrandom() 没有回退路径,改适配的成本比降版本高,直接放弃。
第二次,git 2.47:这次是链接阶段报错,CURLOPT_PROXYHEADER undeclared。原因是 CentOS 7 的 libcurl 版本太老,缺这个选项的宏定义。可以在 configure 时关掉 curl 支持绕过,但那样就失去了 HTTPS 远程仓库的能力,不可接受。
第三次,git 2.43:通过。这个版本对老系统的兼容做得比较好,glibc 2.17 + libcurl 7.29 的组合能正常编完。
结论:CentOS 7 上源码编译 git,2.43 是当前比较稳的上限,再往上要动系统库,不划算。
编译步骤
关键是 --prefix=/usr/local,让新版本装到独立目录,不要覆盖系统自带的 git——系统里可能有其他脚本依赖 1.8 的行为,直接替换风险太大:
cd /tmp/git-src
make configure
./configure --prefix=/usr/local \
--without-tcltk --without-gettext \
--with-openssl --with-curl --with-expat
make -j2
make install
2 核机器 -j2 大约 4 分钟编完。装完之后 /usr/local/bin/git 就是新版,/usr/bin/git 保持不变。由于 systemd 服务的默认 PATH 里 /usr/local/bin 排在前面,Gitea 会自动用上新版本。
验证
/usr/local/bin/git --version # git version 2.43.0
/usr/bin/git --version # git version 1.8.3.1(未动)
ls /usr/local/libexec/git-core/git-remote-https # 有则 HTTPS 可用
第三步容易被忽略:如果编译时没找到 libcurl,会静默跳过 HTTPS 传输支持,导致之后克隆 https:// 的仓库时报 git: 'remote-https' is not a git command。装完一定确认一下这个文件在不在。
顺带说内存
2G 内存的机器在编译时如果遇到 OOM,加个 swap 就好。我这边配了 2G swap 并把 vm.swappiness 调到 10,日常几乎不触发,只在编译和批量任务时兜底。