前言
如果能连接外网,谁甘愿在离线状态下折腾,重新安装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”,但是报错:
1 | yum install https://packages.endpointdev.com/rhel/7/os/x86_64/endpoint-repo.x86_64.rpm |
官网 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:
1 | #mirrors.cloud.aliyuncs.com被我改成了100.100.2.148 |
接着我就发现这样是无法使用的,这个域名的IP一直在变,然后我又找了公司内部的软件源直接把IP替换上去,发现访问超时,看来得解决无法解析域名的问题,后来查到的修改 /etc/resolv.conf
,于是在文件中添加一下内容:
1 | nameserver 114.114.114.114 |
保存之后可以解析域名了,将软件源修改为域名的形式依旧访问超时,这条路彻底走不通了。
离线安装git
离线安装类似于Window上安装一个.msi
文件,不过git貌似没有特别方便的安装包,看看Linux下这些安装方式,基本都是需要联网下载的,其中CentOS还是最麻烦的,需要编译安装。
1 | Debian/Ubuntu |
但是编译git需要有依赖项,还好它依赖的不多,很多教程上来就装一堆,不管有用没有了:
1 | 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的编译,如果没安装会报编译错误:
1 | cache.h:21:18: fatal error: zlib.h: No such file or directory |
在有网的情况下,CentOS使用 yum install zlib-devel
解决,Ubuntu安装 apt-get install zlib1g-dev
解决
安装zlib-devel
如果版本正确通过rpm安装还是挺快的,但是我一开始下载了另一个版本 zlib-devel-1.2.7-18.el7.x86_64.rpm,安装时提示我:
1 | [root@demo software]# rpm -i zlib-devel-1.2.7-18.el7.x86_64.rpm |
我又去下载了 zlib-1.2.7-18.el7.x86_64.rpm ,结果安装时出现冲突:
1 | [root@demo software]# rpm -i zlib-1.2.7-18.el7.x86_64.rpm |
最后找了兼容的版本 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
补充
yum失败
终于找到了我的yum更新源一直超时的原因,是因为我通过 Wandisco GIT存储库
方式尝试安装过 git,步骤如下:
- 先写入新yum存储库配置文件启用Wandisco GIT存储库,在终端输入
vim /etc/yum.repos.d/wandisco-git.repo
文件中加入如下内容,保存退出
1
2
3
4
5
6[wandisco-git]
name=Wandisco GIT Repository
baseurl=http://opensource.wandisco.com/centos/7/git/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco导入存储库GPG密钥
sudo rpm --import http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
- 安装Git
yum install git
结果 opensource.wandisco.com 无法正常访问,导致 yum update
报错,把 wandisco-git.repo 文件删掉就好了
rpm 和 yum 的关系
之前讲到rpm是由Red Hat公司开发的软件包管理方式,使用它可以方便的进行软件的安装、查询、卸载、升级等工作。但处理rpm软件包之间的依赖性问题往往会很繁琐,尤其是当软件由多个rpm包组成时,比如我们在离线安装git时遭遇到的问题。
Yum(Yellow dog Updater, Modified)是一个在Fedora和RedHat等系统上基于RPM包管理前端软件包管理软件,能够从指定的服务器自动下载RPM包并且安装,并自动处理软件包的依赖关系,可以一次安装所有依赖的软体包。
总结来说就是, rpm命令只能安装已经下载到本地机器上的rpm包,并且自己解决依赖问题,yum能在线下载并安装rpm包、更新内核、并自动处理包与包之间的依赖问题。
死去元知万事空,但悲不见九州同~
2023-3-21 23:11:12