前言

如果能连接外网,谁甘愿在离线状态下折腾,重新安装git的起因是服务器上的git版本(1.8.3.1)过低,Mac客户端升级后git版本(2.40.0)太高,导致无法验证密钥来进行拉取操作,所以要把服务器上的git升级一下,而git的1.8.3.1版本貌似是CentOS7的默认版本,我在多篇文章中看到了这个版本号,本来以为分分钟搞定,结果的折腾到半夜。

初次安装失败

开始觉得挺顺利的,如果能升级就直接升级,不能升级就直接移除掉然后安装就行了,然后我就直接通过 sudo yum remove git 删除了git,刷的一下很快啊。

据说在 CentOS 7 上安装新版本 git 最快的方法是通过 End Point 库,所以我跟着找到的教程输入下面的命令企图添加 “End Point Package Repository”,但是报错:

yum install https://packages.endpointdev.com/rhel/7/os/x86_64/endpoint-repo.x86_64.rpm
yum install git

官网 packages.endpointdev.com/有专门讲解安装git 2.x的帖子,看起来很轻松,但是这条路我可能走不通了

我这里提示 “curl:(6) Could resolve host: packages.endpointdev.com; Unknown error”,我的天,难道这台机器不能访问外网?

尝试修改软件源

然后我尝试ping了几个常见的域名均已失败告终,所以我只能离线安装了?后来我发现它不是不能访问外网,只是不能访问域名,所以我自作聪明的把软件源/etc/yum.repos.d/CentOS-Base.repo里的域名都改成了IP:

#mirrors.cloud.aliyuncs.com被我改成了100.100.2.148

enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-7

[updates]
name=CentOS-$releasever
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-7

[extras]
name=CentOS-$releasever
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-7

接着我就发现这样是无法使用的,这个域名的IP一直在变,然后我又找了公司内部的软件源直接把IP替换上去,发现访问超时,看来得解决无法解析域名的问题,后来查到的修改 /etc/resolv.conf,于是在文件中添加一下内容:

nameserver 114.114.114.114
nameserver 8.8.8.8

保存之后可以解析域名了,将软件源修改为域名的形式依旧访问超时,这条路彻底走不通了。

离线安装git

离线安装类似于Window上安装一个.msi文件,不过git貌似没有特别方便的安装包,看看Linux下这些安装方式,基本都是需要联网下载的,其中CentOS还是最麻烦的,需要编译安装。

Debian/Ubuntu
For the latest stable version for your release of Debian/Ubuntu

# apt-get install git
For Ubuntu, this PPA provides the latest stable upstream Git version

# add-apt-repository ppa:git-core/ppa # apt update; apt install git
Fedora
# yum install git (up to Fedora 21)
# dnf install git (Fedora 22 and later)
Gentoo
# emerge --ask --verbose dev-vcs/git
Arch Linux
# pacman -S git
openSUSE
# zypper install git
Mageia
# urpmi git
Nix/NixOS
# nix-env -i git
FreeBSD
# pkg install git
Solaris 9/10/11 (OpenCSW)
# pkgutil -i git
Solaris 11 Express
# pkg install developer/versioning/git
OpenBSD
# pkg_add git
Alpine
$ apk add git
Red Hat Enterprise Linux, Oracle Linux, CentOS, Scientific Linux, et al.
RHEL and derivatives typically ship older versions of git. You can download a tarball and build from source, or use a 3rd-party repository such as the IUS Community Project to obtain a more recent version of git.

Slitaz
$ tazpkg get-install git

但是编译git需要有依赖项,还好它依赖的不多,很多教程上来就装一堆,不管有用没有了:

yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel gcc perl-ExtUtils-MakeMaker package

但是我的机器上 yum 命令已经废了,无法联网安装新的东西,所以这些依赖项我必须找到安装包来离线安装,这就要用到rpm包了。

什么是rpm

rpm(redhat package manager) 原本是 Red Hat Linux 发行版专门用来管理 Linux 各项套件的程序,由于它遵循 GPL 规则且功能强大方便,因而广受欢迎,逐渐受到其他发行版的采用。RPM 套件管理方式的出现,让 Linux 上的软件易于安装和升级,说白了就是可以通过它来安装软件包。

RPM包里面包含可执行的二进制程序,还包括程序运行时所需要的文件有时除了自身所带的附加文件保证其正常以外,还需要其它特定版本文件,这就是软件包的依赖关系,这和Windows的软件包结构类似。

安装准备

  • 下载指定版本git源码 source code
  • 下载zlib-devel-1.2.7-15.el7.x86_64.rpm RPM库
  • 机器上本来有gcc,如果没有自己想办法装吧

幸运的是我的机器上有gcc,并且经过实践发现只要成功安装了zlib-devel就可以完成git的编译,如果没安装会报编译错误:

cache.h:21:18: fatal error: zlib.h: No such file or directory
 #include <zlib.h>
                  ^
compilation terminated.
make: *** [fuzz-commit-graph.o] Error 1

在有网的情况下,CentOS使用 yum install zlib-devel 解决,Ubuntu安装 apt-get install zlib1g-dev 解决

安装zlib-devel

如果版本正确通过rpm安装还是挺快的,但是我一开始下载了另一个版本 zlib-devel-1.2.7-18.el7.x86_64.rpm,安装时提示我:

[root@demo software]# rpm -i zlib-devel-1.2.7-18.el7.x86_64.rpm 
error: Failed dependencies:
        zlib = 1.2.7-18.el7 is needed by zlib-devel-1.2.7-18.el7.x86_64

我又去下载了 zlib-1.2.7-18.el7.x86_64.rpm ,结果安装时出现冲突:

[root@demo software]# rpm -i zlib-1.2.7-18.el7.x86_64.rpm       
        file /usr/lib64/libz.so.1.2.7 from install of zlib-1.2.7-18.el7.x86_64 conflicts with file from package zlib-1.2.7-15.el7.x86_64

最后找了兼容的版本 rpm -i zlib-devel-1.2.7-15.el7.x86_64.rpm 解决了这个问题。

编译git

  • 解压git源码 tar -zxf git-2.28.0.tar.gz
  • 进入解压后的目录,执行安装前检查 make configure
  • 指定安装目录 ./configure --prefix=/usr/local
  • 执行编译安装 make install
  • 查看git版本 git --version

终于装完了,呼~

总结

  • 服务端和客户端的git版本差距过大时可能导致无法验证密钥的问题
  • 在CentOS上git可以采用yum安装,也可以使用 “End Point Package Repository” 来安装
  • 如果想通过编译安装git需要有gcc,还要能安装上zlib-devel依赖项
  • 参考文档:https://zhuanlan.zhihu.com/p/352955774

03-22 12:12