ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CentOS 7安装Git全指南:yum与源码编译详解

CentOS 7安装Git全指南:yum与源码编译详解 做运维的兄弟应该都有这种经历拿到一台CentOS 7服务器第一件事除了改密码、配网、装常用工具基本就是装Git。这个操作看起来简单网上教程也一抓一大把但真到自己动手的时候什么版本太低、编译报错、command not found各种问题全冒出来了。我这几年在CentOS 7上装Git的次数少说也有几十次从内网离线环境到源码编译折腾过一遍今天就把从入门到进阶的装法、配置和踩坑经验全部捋一遍包括yum一键安装、源码编译安装、安装之后的初始化配置还有那些文档里不会写清楚的坑一次说明白。这篇文章适合刚接触Linux的小白也适合打算在生产环境里搞一套干净、可维护的Git环境的同学读完你不仅能装好Git还能搞懂安装背后的原理和路径选择逻辑。文章里选了一个我实际用过多年的方案作为主线每一步都标了可复现的命令和参数直接抄作业就行。1. 动手之前先搞清楚你的CentOS 7到底是什么状态1.1 检查系统版本和基础环境别上来就敲命令很多人拿到服务器就开始敲yum install -y git然后就开始等。但我建议你先花30秒确认一下系统状态避免装到一半才发现环境不对白折腾。第一步是确认系统是不是CentOS 7虽然听起来弱智但真的有人把CentOS 8或者Stream当7用然后发现命令和软件源行为完全不一样。cat /etc/redhat-release正常会输出类似CentOS Linux release 7.9.2009 (Core)的内容。这能确认你的系统是7.x版本。接着看下系统架构uname -m服务器基本都是x86_64但如果是个ARM的板子或者云上的ARM实例输出的就是aarch64。这个信息决定了后面下载源码包或者添加软件源时该选哪个架构别小看这一步我见过有人拿x86的RPM包装到ARM机器上结果直接报错。再看下系统的软件源是不是好的yum repolist如果这个命令执行后返回一堆repo列表说明源能用。如果报错或者列表为空那你后面用yum装东西百分百会失败就得先处理源的问题。CentOS 7的源是这么多年运维绕不开的话题官方源停止维护后建议提前换成可用的镜像源具体操作后面会单独说。1.2 搞清你的安装目标要的是稳定老版本还是新功能版本装Git之前先想明白一个问题你是装来自己敲代码、提交代码还是要给团队搭一个统一的代码托管环境或者是给CI/CD流程打基础不同目标对应的安装方式完全不一样。如果只是本机用一用git版本不太旧就无所谓那直接用系统自带的yum装最省事几秒钟搞定后面升级、卸载都有系统包管理器统一管理。但CentOS 7官方源里的git版本停留在了2.x的早期版本功能上缺少一些新特性比如部分新命令、加密协议的支持、对某些新平台密钥格式的处理。如果你要跟新的Gitea、GitLab或者某些云平台做对接版本低有时候会出现协议不兼容的怪问题。如果是要装最新版或者生产环境需要固定一个已知版本做统一的交付标准那源码编译安装是更稳的路子。Git官网的release页面可以下载任意版本的源码包编译参数可以自己定制装完存放在/usr/local/git下跟系统自带的文件完全不冲突。代价是编译过程需要一点时间还要解决一堆依赖后面我会把整个编译过程写清楚。另外还有一种方式是通过维护第三方软件源的社区仓库安装这类源里通常提供了比系统源新的版本但这类源需要额外添加repo并且你要信任这个源的维护者。对于生产环境我个人的建议是要么yum老版本要么源码编译固定版本尽量不要引入额外的第三方源因为后续维护依赖关系会变得很麻烦。2. 最省事的方案用yum一条命令装好Git2.1 安装前更新缓存避免装到一半报依赖错yum安装Git本身不复杂但在装之前我还是建议先刷新一下软件源缓存把已有的软件包元数据更新到最新这样能减少装到一半出现依赖解析错误的概率。尤其是你刚装完系统第一次用yum时缓存往往是空的。yum clean all yum makecache这两条命令一个清理本地缓存一个重新生成缓存。速度取决于你的网络和源质量如果用的是内网源或镜像源一般几十秒就完成了。然后就是正式安装Gityum install -y git安装过程会去解析依赖比如git依赖一些 Perl 模块和 curl 相关的库这些都会被自动拉进来。装完以后命令行会显示Complete!到这一步其实Git就已经装好了。2.2 验证安装结果和版本号装完以后一定要验证一下别急着跑路git --version系统源装出来的版本一般是git version 1.8.3.1或者类似的老版本。看到这个版本号说明命令行工具已经可用了。接着再看下安装路径which git通常输出是/usr/bin/git这是yum安装的标准路径。同时可以看下git的配置文件默认路径git config --list --system这条命令会列出系统级的Git配置主要是/etc/gitconfig这个文件里的内容。如果没有内容说明还没有做过系统级配置也正常。2.3 yum方式装的Git目录和升级方式要心里有数用yum装的Git所有的文件都散落在系统目录下主程序在/usr/bin/git文档和帮助文件在/usr/share/doc/下面还有一部分依赖库会放在/usr/share/git-core里。这种安装方式的好处是卸载非常干净一条yum remove -y git就能全部清掉。后续升级也简单想升级就再次执行yum update -y git但因为CentOS 7官方源里的版本基本不会更新了这条命令大概率显示“没有可升级的软件包”。所以这种方式的优点和缺点都很明显省事但版本旧。日常个人使用完全够但如果遇到新特性的需求就得考虑下面的源码编译方案了。3. 进阶方案源码编译安装你想要的Git版本3.1 为什么生产环境我更喜欢编译安装在生产环境里我最忌讳的事情是同一个软件在不同机器上版本五花八门。今天这台系统源装的是1.8明天那台机器换了个源装出2.27等出了问题排查的时候别人问一句“你哪台机器什么版本”你就头大了。所以一旦要统一版本、统一部署标准编译安装固定一个版本反而比yum更可控。编译安装还有另外几个实打实的好处一是可以指定安装前缀把Git完全隔离在一个目录里比如/usr/local/git将来不要了直接删目录二是可以决定编译哪些功能模块比如选择是否支持subversion协同、是否编译GUI工具三是可以对新版内核、新协议有更好的兼容性。当然编译安装的代价是过程稍微长一点依赖多一些。以Git 2.39.2为例整个编译过程如果机器配置还行大概5到10分钟能完成可接受。3.2 安装依赖包一个都不能少编译Git必须的依赖有C编译器gcc、make工具、Tcl/Tk如果你想编译gitk和git gui、curl和curl-devel支持HTTPS协议、zlib-devel压缩支持、perl-ExtUtils-MakeMakerPerl模块构建、openssl-develSSL支持、expat-develHTTP协议支持。注意这些依赖缺了任何一个编译过程中都可能报错所以千万不要跳步。yum install -y gcc make curl curl-devel zlib-devel perl-ExtUtils-MakeMaker openssl-devel expat-devel tk-devel gettext-devel asciidoc xmltoasciidoc和xmlto这两个包是编译文档时用的如果你不想编译HTML和man文档可以不用。但装上了也没坏处编译起来会更完整。如果你在编译过程中遇到报错提示缺少某个头文件那就回来再用yum安装对应的-devel包这是最省心的处理方式。3.3 下载源码、解压、指定路径编译下载Git源码我一般选择从Git官网下载。找到你想要的版本比如2.39.2下载tar.gz包wget https://github.com/git/git/archive/refs/tags/v2.39.2.tar.gz如果你从github下载速度很慢也可以直接从Git官网的release镜像下载链接格式类似https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.39.2.tar.gz这种方式比较稳定。下载完成后解压并进入目录tar -zxvf v2.39.2.tar.gz cd git-2.39.2接下来是配置编译参数。我用的前缀路径是/usr/local/git把Git独立安装到这个目录下再通过软链接或PATH变量让系统找到它./configure --prefix/usr/local/git --with-curl --with-expat--with-curl是启用HTTP/HTTPS协议支持--with-expat是启用HTTP智能协议支持。如果你不需要可以不加但建议都加上。配置完成后开始编译这里可以用多核加速编译比如4核机器就用-j4make -j4如果全程没有报错进入安装步骤make install安装完成后Git就静静地躺在/usr/local/git目录下了。3.4 把新版本接入PATH环境变量并验证最终效果这一步是最容易出问题的。因为系统原来可能已经存在/usr/bin/git而/usr/local/git/bin不一定会被搜索到这时候你敲git --version看到的还是老版本。我的做法是做一个软链接把新版本的git命令链接到系统标准路径下这样执行git时会直接命中新版本ln -s /usr/local/git/bin/git /usr/bin/git如果你想更灵活一点也可以把/usr/local/git/bin加进/etc/profile的PATH里然后在其他机器上手动控制优先级。软链接做完以后重新打开终端或者执行hash -r刷新一下命令哈希表再验证git --version这时候应该能看到你编译的版本号比如git version 2.39.2。看到这个版本就说明你的源码编译安装彻底成功了。3.5 其他可选组件gitk、git gui和completion如果编译过程中你安装了tk-devel那么gitk和git gui应该也能用了。这两个图形工具在服务器上用得少但本地搞个图形界面还是有用的。验证一下/usr/local/git/bin/gitk --version另外Git的补全脚本一般在contrib/completion/目录下你可以在~/.bashrc里source一下就能在敲git che的时候按Tab自动补全成git checkout这个体验在命令行里非常有价值source /usr/local/git/contrib/completion/git-completion.bash我一般会把这句话写进/etc/profile.d/git.sh里这样所有用户登录都会自动加载。4. 装完Git之后这几步初始化配置千万别跳过4.1 配置 user.name 和 user.email不然提交直接报错Git安装完以后第一次提交代码之前必须配置用户名和邮箱。不配的话当你执行git commit时会直接报错提示please tell me who you are就是说Git不知道你是谁没法给提交打上作者标记。配置本地用户当前用户git config --global user.name 你的名字 git config --global user.email your_emailexample.com如果你想在某一个仓库里用不同的身份提交可以去掉--global在仓库目录里单独配置git config user.name 针对这个仓库的名字 git config user.email 针对这个仓库的邮箱这里要特别注意邮箱信息是会被公开显示在提交历史里的如果是开源项目建议用一个不常接收垃圾邮件的邮箱避免隐私泄露。我见过有人直接用公司邮箱提交到个人开源项目后期不胜其扰。配置完以后可以查看配置git config --list4.2 换行符、别名和默认编辑器这些细节几个比较实用的初始化设置能让你在日常使用中少踩很多坑。第一是换行符处理。Windows下代码默认是CRLF换行Linux和macOS是LF。如果一个项目在Windows和Linux之间来回切换Git默认会自动转换但有时候转换会造成奇怪的变化。我一般建议在Linux服务器上设置git config --global core.autocrlf input意思是提交时把CRLF转换成LF检出时不转换这样在Linux环境下存仓库里的文件保持LF避免一些无谓的diff。第二是别名。用久了你会发现有些命令特别长比如git checkout、git status完全可以简化git config --global alias.st status git config --global alias.co checkout git config --global alias.br branch git config --global alias.lg log --oneline --graph --all --decorate配置完之后git st就是git statusgit lg就是带图形展示的提交记录效率提升不是一点点。第三是设置默认编辑器。不设置的话Git会调用系统默认的vi如果你对vi不熟悉在git commit时可能会卡在编辑器里不知道怎么退出git config --global core.editor vim如果你更习惯用nano也可以设置成nano。4.3 SSH密钥生成和公私钥配对让本地免密连接代码平台用HTTPS方式连接Git仓库每次都要输密码非常痛苦。更常用的做法是配SSH密钥然后通过SSH协议拉代码。生成密钥ssh-keygen -t rsa -b 4096 -C your_emailexample.com如果是一路回车密钥会默认生成在~/.ssh/id_rsa下私钥文件是id_rsa公钥文件是id_rsa.pub。把公钥内容复制出来cat ~/.ssh/id_rsa.pub然后把这段内容配置到你的代码托管平台后台比如Gitee或者GitHub的SSH keys设置里。配置完成以后可以用下面命令测试连接ssh -T gitgitee.com第一次连接的时候会询问是否确认主机指纹输入yes回车即可。如果输出一段欢迎语说明密钥已经配对成功之后clone和push都不需要输密码了。这里有一个常见的坑SSH密钥文件的权限太开放SSH客户端会拒绝使用。比如密钥文件权限是别人也能读写这时候会报Permissions 0777 for id_rsa are too open。解决办法chmod 600 ~/.ssh/id_rsa chmod 700 ~/.ssh这个权限问题尤其容易在解压备份文件、复制其他机器的密钥时出现一定记得检查。5. 安装和配置中出现的问题以及我的排查方法5.1 安装阶段高频报错和解决方案速查安装Git的过程中我见过、也处理过不少报错把最典型的几个整理出来你可以对照排查问题现象原因解决方法bash: git: command not foundGit没装上或者PATH没包含git路径执行yum install -y git或用软链接把git加入/usr/binyum install报Cannot find a valid baseurl for repo系统源失效或网络不通检查网络更新/etc/yum.repos.d/下的源配置为可用镜像源编译时报No such file or directory缺基础编译工具安装gcc、makeyum install -y gcc make编译时报curl/curl.h: No such file or directory缺少curl开发头文件yum install -y curl-devel编译时报openssl/ssl.h相关错误缺少SSL开发头文件yum install -y openssl-devel编译时报expat.h相关错误缺少expat开发头文件yum install -y expat-develmake install没报错但git --version还是老版本PATH顺序问题或软链接没生效执行hash -r并确保软链接已创建SSH连接时报权限过宽密钥文件权限太高chmod 600 ~/.ssh/id_rsa这张表我建议你截图或者存一下尤其是首次编译Git的时候大概率用到其中一两条。5.2 编译到最后阶段发现缺文档模块这种情况如何补救编译Git的时候有个比较尴尬的情况前面各种依赖都装好了编译过程也很顺利但到make install阶段突然报错提示缺少xmlto或者asciidoc相关工具。这是因为Git的文档模块需要这些工具来生成HTML和man帮助文档。如果你不关心文档可以绕过去make install NO_DOCBOOK1 NO_GETTEXT1加了这两个参数之后编译系统会跳过文档生成阶段只安装核心程序。我后来重新测试下来发现先安装xmlto asciidoc再编译是最省心的因为报错信息不那么直观新手容易卡在“为什么我编译一半突然失败”上面。既然使用yum install -y asciidoc xmlto就能解决就别在这上面省。如果编译时没用--prefix/usr/local/git指定前缀默认会安装到/usr/local下面这时候git会出现在/usr/local/bin/git。不要惊讶路径不同而已软链接或PATH指向对就行。5.3 配置文件混乱导致的行为难以捉摸Git的配置分三个层级系统级/etc/gitconfig、用户级~/.gitconfig、仓库级.git/config。如果同一个配置项在三个层级里都出现了仓库级的优先级最高用户级次之系统级最低。我排查过不少莫名其妙的git行为最后发现都是配置冲突导致的。比如有人全局配置了一个很长的user.name结果在某个仓库里提交时发现作者名莫名其妙不对一看是这个仓库的.git/config里写了一个旧的user.email。排查这种问题用这条命令看所有配置的生效值最直观git config --list --show-origin它会显示每个配置项来自哪个文件你再结合优先级去判断到底是谁生效了。这个命令在网络上是很多Git教程不会提的但实际排查时真的能救命。5.4 常见运行期问题换行符、中文文件名和SSL证书还有一个经常被问到的坑是git status显示中文文件名变成了一串八进制的转义字符类似\346\265\213\350\257\225其实文件本身没有损坏只是Git默认对非ASCII字符做了转义。想让中文文件名正常显示执行git config --global core.quotepath false这个设置就是热搜词里那个-c core.quotepathfalse参数对应的持久化版本很多CI/CD脚本里临时加这个参数就是为了避免中文路径被转义。另外一个运行期问题跟SSL证书有关。在内网环境如果用了自签名HTTPS证书的Git服务clone时可能报SSL certificate problem。在不推荐全局关闭证书校验的前提下你可以针对这个仓库单独配置git config http.sslVerify false但请一定注意这个方法只用于内网可信环境。在公网环境下把sslVerify关了等于裸奔非常不建议。6. 我在实际项目中的做法和一些经验收尾我把这套东西用到实际项目里以后新机器的Git部署基本已经变成一条标准流水线了。先说我的最终推荐方案供你参考。如果是临时开发机或者个人实验环境直接yum install -y git就完事省时间、省心版本旧一点不影响日常工作。如果是团队统一开发环境、CI/CD构建节点或者要对接新的代码托管平台我建议走源码编译安装固定版本像2.39.x或者更新的稳定版把版本号写进团队的初始化脚本里。好处以后再有人问你环境版本的时候你可以直接说固定是哪个版本所有机器行为一致出了问题也好复现。初始化这一步不要省user.name、user.email、别名、quotepath这几个我每次必配。SSH密钥这块如果是给服务器部署用的建议单独生成一个专用密钥对把私钥放在专用的部署账号下不要用root去日常拉代码。因为一旦用root拉代码权限问题会很麻烦而且也不安全。关于Git版本升级如果你是编译安装的后面要升版本很简单重新下载新版本的源码包执行同样的./configure --prefix/usr/local/git、make make install覆盖安装即可。老版本的文件会被新版本覆盖配置都保留着不会丢。如果你是yum安装的想升到新版本反而更麻烦一些需要先卸载再编译或者换源这也是我在生产环境更倾向于编译安装的原因之一。最后再分享一个小技巧在CentOS 7上做完所有配置后把配置历史保存一份比如整理成一个install_git.sh脚本放到团队的初始化配置仓库里下次新机器跑一遍就齐活。我在实际工作中把这个脚本跑了几十次每次都能顺畅装好Git基本不会为这个事再耗费精力。希望这篇文章能帮你少走弯路有问题也可以在评论区交流你遇到的具体报错我尽量帮你排查。
返回列表