
做服务器运维或者搞开发的同学应该都有过这样的经历新拿了一台CentOS 7服务器第一件事往往不是装业务环境而是先把Git装上。这东西看着简单网上教程一搜一大把很多人说“yum install -y git”一行命令就完事可真到了生产环境事情远没有这么顺利。版本太老、依赖缺失、编译失败、PATH配置不对导致git命令找不到……这些坑我全都踩过。这篇文章就把我在CentOS 7上安装Git的完整过程整理出来包括环境检查、yum安装、源码编译、基础配置、SSH密钥以及常见报错排查。不管你是刚入门Linux的新手还是已经写了几年脚本的老手里面有些细节值得扫一眼——尤其是源码编译部分能帮你少折腾好几个小时。1. 安装前的环境检查与方案选型很多人装Git上来就敲命令装完也不验证等真正提交代码的时候才发现版本不对或者git不可用。我在安装之前习惯先花两分钟把服务器信息摸一遍这样后续每一步操作都有底。1.1 先摸清服务器底细拿到服务器第一件事确认系统到底是什么版本、什么架构、能不能联网。这三项影响后续所有操作。# 查看发行版版本 cat /etc/redhat-release # 查看系统架构 uname -m # 看是否已经装过Git git --version which git # 验证yum源是否可用 yum repolist在CentOS 7上cat /etc/redhat-release 一般会输出 CentOS Linux release 7.x (Core)。架构这块x86_64是绝大多数服务器的标配但如果你拿到的是ARM架构的机器比如华为鲲鹏、飞腾这类国产芯片服务器后面源码编译时需要注意工具链的差异下载预编译包也要认准aarch64版本。git --version这行命令值得多说一句。有些系统可能预装了Git但版本特别老有些则压根没装会提示 command not found。这两种情况处理方式完全不同前者可能只需要升级后者要全新安装。我遇到过一台服务器上同时存在 /usr/bin/git 和 /usr/local/bin/git 两个版本的情况敲git命令时用的是哪一个完全取决于PATH的搜索顺序这种事不提前查清楚后面很容易被搞晕。1.2 两条安装路线怎么选CentOS 7上安装Git主要有两种方式yum安装和源码编译安装。这两条路线的取舍很简单但对很多人来说是老大难问题我直接给结论。对比项yum安装源码编译安装安装速度快依赖自动处理慢依赖需要手动补齐Git版本CentOS 7仓库里是2.x相对老旧可以选择任意新版本卸载/升级方便rpm管理麻烦需手动清理功能特性基础功能完整新命令新协议都支持维护成本低较高我的建议是大多数场景直接用yum装就够用。如果你只是往Gitee、GitHub上提交代码、拉取代码或者做CI流水线的基础环境系统自带版本完全能胜任。只有当你对Git版本有硬性要求时——比如某些自动化工具链要求Git版本不低于2.28或者你想体验git switch这类新命令才需要考虑源码编译安装。判断自己该走哪条路有一个很简单的标准先用yum装上然后 git --version 看版本如果版本满足你的需求直接跳过第3章做配置就行如果版本确实不够用再走源码编译。不要一上来就搞编译编译装Git其实是一次性成本很低但时间成本并不低的操作不值得为了追新而追新。2. 用yum快速安装Git大多数人够用了yum是CentOS 7默认的包管理器它会自动处理依赖关系。比如Git依赖的一些库文件yum会一并装上这比自己手动去凑依赖省心太多。2.1 一键安装与基础验证安装命令非常简单就一行yum install -y git-y参数的意思是安装过程中所有交互提示都默认选yes省去手动确认。安装完成后系统会输出 Complete 字样这时用git --version验证安装结果。git --version # 输出类似git version 2.x.x你可能注意到我还喜欢顺手敲一句rpm -ql git来看安装位置。Git会被装到 /usr/bin/git配置文件放在 /etc/gitconfig。这里有一个小坑如果你之前用源码方式在 /usr/local 目录装过Gityum安装可能会让系统里同时存在两个Git这时候 which git 的输出会直接决定你到底用的是哪一版务必用 which 确认。另外补充一点如果你的服务器yum源里找不到git或者报错先跑一下yum clean all yum makecache重建缓存。很多时候是源的问题尤其内网服务器使用本地镜像源时仓库列表经常没同步干净。这种情况我见过不少次第一次yum install失败后大多数人会怀疑是不是软件有问题其实八成是yum源没有配好。2.2 为什么系统自带的Git版本这么老yum安装Git时很多人会发现装出来的版本号并不新CentOS 7仓库里的Git版本一般停留在2.x的中早期版本。这是CentOS 7的策略决定的系统生命周期内软件仓库只做安全补丁更新不做大版本升级。软件包版本被刻意冻结以保证生产环境稳定。版本冻结的影响说明安全严重漏洞会修复但新功能不回来兼容依赖相对保守不容易和系统库冲突限制新工具链若要求Git高版本可能直接报错版本老不一定是坏事生产环境追求的是稳定旧版本功能完全够用。但有一个场景我建议果断放弃yum版本当你使用的代码托管平台或者CI系统提示“Git version is too old”时别再试图给旧版打补丁直接源码编译一个新版更省事。另外Git 2.28之后引入了git init -b main这种指定默认分支名的参数如果你习惯用main分支作为默认分支老版本确实不方便。3. 源码编译安装新版Git需要新特性时再动手当yum版本的Git满足不了需求时源码编译是唯一的路。虽然过程比yum多几步但掌握了之后整个过程也就十五分钟。我在这节把编译过程中容易翻车的点都标出来。3.1 把编译依赖一次装齐编译Git前需要一堆开发库少了任何一个编译到一半就可能报错。我的建议是直接把下面这一长串依赖一次性装齐省得来回折腾。yum install -y gcc curl-devel expat-devel gettext-devel \ openssl-devel zlib-devel perl-ExtUtils-MakeMaker逐个说说这些依赖是干什么的。gcc不用多说编译器没有它什么都编不了。openssl-devel 提供HTTPS相关的加密库Git clone远程仓库用的是HTTPS协议缺了它编译出的Git无法使用https链接。curl-devel 处理HTTP传输expat-devel 用来解析XML文档zlib-devel 负责数据压缩。前面这几个都比较常见常常被漏掉的是 perl-ExtUtils-MakeMaker——Git的构建脚本依赖Perl模块没有这个包编译时会在生成文档或脚本环节直接卡住。注意不要想着省依赖。编译Git时缺依赖不一定立刻报错有些模块会以静默方式被跳过最终装出一个功能残缺的Git。比如缺了openssl-devel编译过程可能成功但git clone https链接时会报错这种隐性故障排查起来比编译失败更痛苦。装完依赖后验证一下gcc是否可用gcc --version如果提示 gcc: command not found就说明yum里没装上重新执行一次安装命令或者检查一下yum源。3.2 下载源码、配置、编译、安装这一步是整个过程的重点。我从Git的官方镜像站下载源码包你也可以从GitHub的 releases 页面下载二者本质一样。# 下载源码包版本号按需修改 wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.43.0.tar.gz # 解压 tar -zxvf git-2.43.0.tar.gz # 进入目录 cd git-2.43.0 # 配置安装路径 ./configure --prefix/usr/local/git # 编译-j参数指定并行任务数 make -j$(nproc) # 安装 make install这里--prefix/usr/local/git是我推荐的做法把Git独立安装到 /usr/local/git 目录下而不是覆盖系统自带的 /usr/bin/git。这样做的原因是避免破坏rpm管理的系统文件日后想卸载直接删掉这个目录和PATH配置就行干净利落。make -j$(nproc)中 nproc 命令会返回CPU核心数-j参数让编译过程并行执行。如果是4核服务器编译时间大概三五分钟如果是单核小机器可能要等二十分钟要有心理准备。编译期间偶尔会冒出一些warning警告信息不用太紧张。但如果是error说明缺了某个依赖回到3.1检查一下。编译完成后的输出信息里能看到$ ./git --version这样的提示这是安装成功的标志。3.3 设置全局PATH并处理与系统自带Git的共存编译安装完成后新Git在 /usr/local/git/bin 目录下但系统默认的PATH可能不包含这个目录。不加配置直接敲 git 命令用的还是旧版本。# 创建环境变量配置文件写入PATH echo export PATH/usr/local/git/bin:$PATH /etc/profile.d/git.sh # 使配置立即生效 source /etc/profile.d/git.sh # 验证 which git git --version写在 /etc/profile.d/ 目录而不是 ~/.bashrc是因为前者对所有用户生效登录shell时自动加载。服务器上通常不只有一个账号需要用的Git写成全局配置一劳永逸。如果 which git 的输出和 git --version 显示的还是旧版本说明PATH顺序有问题。系统会从左到右搜索PATH目录先找到哪个目录的git就用哪个。查看一下当前的PATHecho $PATH正常情况下 /usr/local/git/bin 应该排在 /usr/bin 前面。如果没有排到前面检查 /etc/profile.d/git.sh 的内容是否写对或者重启一次终端会话。这里还有个细节如果是通过ssh重新登录环境变量才会重新加载如果是长连接的session记得先 source 一下。4. Git装好之后的初始化配置与SSH密钥Git装完不等于能用不初始化配置就提交代码第一下就会撞墙。这一节的内容不管是yum装的还是源码编译的全都适用。4.1 先把身份信息配好否则没法提交Git每次提交都会记录作者信息没有身份信息会有两种情况要么提交直接被拒绝要么提交记录里显示一串奇怪的默认用户名和邮箱看起来像垃圾提交。我见过很多人装完Git后不配用户名邮箱往仓库里一提交commit历史的作者变成 rootlocalhost这种记录对团队协作来说基本没有追踪价值。# 配置全局用户名 git config --global user.name 你的名字 # 配置全局邮箱 git config --global user.email youexample.com # 查看所有配置 git config --list配置信息保存在 ~/.gitconfig 文件里你也可以直接编辑这个文件效果一样。Git配置有三个级别system、global、local。优先级从高到低是 local global system。local级别只在当前仓库生效适合在不同项目里使用不同身份的场景。比如在公司电脑上公司的项目用公司邮箱个人项目用个人邮箱就可以给公司仓库单独执行 git config user.email 而不带 --global 参数。再说一个和身份配置相关的高频操作git commit --amend。很多人提交完发现用户名写错了或者信息写错了不用重新提交直接git commit --amend --reset-author可以在修订提交信息的同时把作者信息也刷新成当前配置。4.2 生成并配置SSH密钥本地Git和远程仓库服务器的交互方式主要有HTTPS和SSH两种。HTTPS每次都要输账号密码虽然可以用凭据管理器缓存但总归不够顺手。SSH方式配置一次长期免密更推荐。# 生成SSH密钥对-C参数是注释标识建议填自己的邮箱 ssh-keygen -t rsa -b 4096 -C youexample.com执行后一路回车即可密钥默认生成在 ~/.ssh/id_rsa私钥和 ~/.ssh/id_rsa.pub公钥。文件名的选择rsa是最通用也最不容易出问题的算法。有些教程推荐ed25519它的性能更好但如果你的旧版Git或服务器的SSH版本比较老rsa兼容性更稳。生成的公钥内容查看方式cat ~/.ssh/id_rsa.pub把输出的字符串完整复制粘贴到代码托管平台的SSH公钥设置里Gitee、GitHub等平台都有这个入口。粘贴后测试连接ssh -T gitgitee.com第一次连接会提示确认主机指纹输入 yes 回车。后续如果返回类似 Hi xxx! Youve successfully authenticated 的提示说明SSH配置成功。有一个坑如果服务器用的是非root账号~/.ssh 目录的权限如果配置不对SSH客户端会直接拒绝使用你的密钥。这个时候可以用以下命令修复chmod 700 ~/.ssh chmod 600 ~/.ssh/id_rsa4.3 顺手解决中文乱码的几个地方Git在默认配置下对中文文件名、中文提交信息显示得并不友好。status 命令输出的中文文件名会变成一串转义符看着非常头疼这个问题的根源是Git默认把非ASCII字符做了转义。# 让中文文件名正常显示 git config --global core.quotepath false # 确保提交信息编码为UTF-8 git config --global core.commitencoding utf-8 git config --global i18n.logoutputencoding utf-8顺手把终端字符集也确认一遍echo $LANG # 确保输出类似 en_US.UTF-8 或 zh_CN.UTF-8如果你的服务器locale是POSIX或者CGit的输出照样可能乱码。这属于系统层面字符集没有设置好的问题和Git配置是两码事。解决方式是在 /etc/profile 或 /etc/locale.conf 里设置export LANGen_US.UTF-8再source一下。总之遇到乱码先查两层一层是Git配置的quotepath和编码一层是系统的locale。5. 常见报错与排查实录装Git这件事本身不复杂但报错类型五花八门。我把自己遇到最多的几个问题整理成诊断清单每个问题都给出定位思路和解决方案。5.1 fatal: not a git repository (or any of the parent directories): .git这是一个极其常见的报错基本每个用过Git的人都见过。这个报错的含义是Git在当前目录以及所有上级目录中都找不到 .git 目录因此不知道你在操作哪个仓库。出现这个报错的场景主要有三种你在一个普通文件夹里执行了 git status 之类的命令你克隆仓库时没有指定目录Git默认在当前目录创建仓库但你把命令跑到了别的目录仓库的 .git 目录被误删了比如不小心执行了 rm -rf .git别问我怎么知道的。排查方式# 检查当前目录下有没有.git目录 ls -a # 查看Git认为的仓库根目录 git rev-parse --show-toplevel如果确认自己应该在一个仓库目录里却找不到.git可以用git init在当前目录重新初始化或者检查一下是不是环境变量 GIT_DIR 被设置到别的地方了。有些脚本会 export GIT_DIR/some/path这会把你的Git操作指向一个完全不同的仓库。5.2 git: command not found这个报错比较基础要么是Git没装成功要么是装了但PATH没配置好。第一种情况好排查直接在yum源里重新安装或者检查安装过程有没有报错。第二种情况多半是源码编译安装后忘了配PATH执行以下命令确认which git echo $PATH如果 /usr/local/git/bin 没出现在PATH里回到3.3把环境变量配上。这里还有一个冷门坑如果服务器开了SELinux且Git安装在非标准路径SELinux策略可能会阻止可执行文件的运行。如果在系统日志里看到 avc: denied 相关记录多半就是这个原因。临时验证可以将SELinux设为Permissive模式但如果确认是这个原因还是建议把Git装回标准路径不要为了省事关闭SELinux。5.3 SSL certificate problem 无法访问远程仓库git clone 一个HTTPS远程仓库时有时会报 SSL certificate problem: unable to get local issuer certificate。这个问题我在内网服务器上遇到的频率很高排查思路按几下顺序来。# 1. 同步系统时间最常见原因证书有效期判定依赖系统时间 date # 2. 如果时间不对同步时间 yum install -y ntpdate ntpdate ntp.aliyun.com # 3. 确认系统证书库完整 yum install -y ca-certificates如果以上三个步骤都做了仍然报错再检查你访问的远程仓库是不是使用了自签名证书。自签名证书不被系统信任这种情况下要么把证书加入信任库要么使用克隆时忽略证书校验的方式。命令行可以使用环境变量 GIT_SSL_NO_VERIFYtrue 临时绕过校验但这不是长久之计。正规做法是让运维把仓库服务器的证书换成被广泛信任的CA证书或者把自签名证书加到 /etc/pki/tls/certs/ca-bundle.crt 里。这里插一句服务器系统时间错乱导致SSL证书报错是我处理过最多的问题。一些云服务器创建镜像后时间没有正确同步会导致证书验证失败。在排查证书问题时第一步永远是看时间不要直接在Git配置里禁用证书校验那个方向只会把问题越绕越深。5.4 其他容易被忽略的小坑速查运维过程中还遇到过下面这些零碎问题单个看都挺小命中一个也挺烦人整理成速查表现象原因解决方式提交时报 Permissions 0777 错误git目录或文件权限过宽chmod 755 或 644 修正Git拒绝在0777目录执行安全操作warning: LF will be replaced by CRLF系统换行符与Git不一致git config --global core.autocrlf inputLinux上建议保持LFgit push 提示 HTTP Basic: Access denied凭据过期或密码错误重新执行 git config --global credential.helper store 并push一次输入新密码克隆大仓库时网络超时部分网络环境或代理影响调整 lowSpeedLimit 和 lowSpeedTime 参数或配置合适的代理合规场景下IDE拉取代码时失败并提示 git -c diff.mnemonicprefixfalse -c core.quotepathtrueGUI客户端使用的git命令参数确认客户端调用的是哪个git检查PATH不要同时存在冲突版本6. 写在最后几句掏心窝的话我这些年给服务器装Git装了很多次最大的体会是多数情况下yum装完就够没必要折腾源码编译。别把时间浪费在追版本号上代码能不能正常提交、分支切换顺不顺手远比Git版本新不新重要。但如果你恰好处在需要新版Git的场景源码编译这条路也不难走把依赖装齐、prefix路径规划好、PATH配好一次就成。再分享一个工作习惯我在维护服务器时维护了一份“新服务器初始化清单”其中第一项就是yum装Git加配置身份信息。每次新到一台机器按着清单跑一遍五分钟搞定基本不会漏掉配置项。你也可以给自己建一个这样的清单把安装命令、配置命令、SSH密钥命令按顺序写进去下次直接复制执行。关于Git的使用其实安装只是第一步真正值钱的是日常操作中那些命令组合的使用经验。比如git commit --amend修提交、git rebase -i整理历史、git stash暂存工作区这些命令用好了效率能提升不少。安装好Git之后多花点时间熟悉这些高频操作比反复折腾安装方式更有价值。