拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Linux下Git配置完整指南:从安装到SSH免密与别名提速

很多人拿到Linux服务器第一件事就是装Git、配Git但绝大多数人装完之后只在全局配了个user.name和user.email就以为完事了。等到真正用起来才发现提交记录一团糟、每次push都要输密码、换行符被改得面目全非、一不小心还把自己已经push的提交amend掉了——这些坑我几乎全踩过一遍。这篇文章就把我在Linux环境下手动配置Git的完整思路、实操命令和踩坑记录整理出来从安装方式到配置文件层级从SSH密钥到别名提速每一行都是直接在服务器上验证过的东西。适合刚接触Linux想老老实实把Git配好的新手也适合已经用了很久但一直没时间整理自己配置的老手——看看我整理的这份配置单说不定能帮你补上几个一直没解决的痛点。1. 为什么Linux下配置Git值得认真对待1.1 安装只是开始配置决定体验Git在Linux下的安装从来不是难事apt install git或者yum install git一条命令就能搞定。但安装之后的状态跟“能用到顺手”之间还差着很大一段距离。默认配置下的Git有几个很烦人的行为提交时如果没有配置用户信息会直接报错拒绝提交默认分支名是master而现在的远程仓库主流默认分支都是main每次推送HTTPS远程仓库都要反复输入账号密码提交信息默认甩给你一个Vim对不熟悉Vim的人简直是折磨处理中文文件名和路径时显示成八进制转义……这些问题的根源都在于Git有一整套“出厂设置”而“出厂设置”往往是为了兼容性而不是为了好用。所以我一直认为Linux下装Git只是碰了个头真正花时间的应该是安装之后的配置阶段。配置做得好后面几年都用得舒心配置不弄每一次提交、每一次推送都可能被这些小毛病膈应一下。1.2 配置文件的三个层级搞懂它就搞懂了一半Git的配置体系设计得挺巧妙它把配置分成了三个层级从系统级到仓库级一层层往下覆盖。--system配置文件在/etc/gitconfig作用于这台机器上的所有用户所有仓库。一般只在服务器统一管理时才用普通个人电脑很少动它。--global配置文件在~/.gitconfig作用于当前系统用户的所有Git仓库。个人常用的配置基本都写在这一层。--local配置文件在仓库内的.git/config只作用于当前这个仓库。当某个项目需要跟其他项目不一样的配置时就用这一层。三个层级的优先级从低到高是system global local。也就是说如果三个层级对同一个配置项都做了设置最终生效的是local。这个优先级规则我建议牢牢记在心里排查问题时非常有用——很多时候你改了~/.gitconfig没反应回头才发现是仓库内的.git/config里有一项local配置把它覆盖了。查看当前生效的完整配置用git config --list它会按层级顺序把最终生效的所有配置项列出来。想精确查某一个配置项用git config user.name这种形式就行。想查某个配置项到底被哪一层设置过用git config --show-origin --get user.name这个命令会告诉你配置来自哪个文件哪一行排查问题的时候极其有效。2. 安装Git的完整流程2.1 包管理器安装又快又稳的首选Linux发行版众多但主流的包管理器无非就是那几套。Debian系的Ubuntu、Debian使用aptRed Hat系的CentOS、Fedora、RHEL从老到新经历了yum到dnf的演变还有Arch系的pacman、openSUSE的zypper。以最常用的Ubuntu为例安装只需要两条命令sudo apt update sudo apt install git -yCentOS 7及以下版本用sudo yum install git -yCentOS 8以上或者Fedora直接用sudo dnf install git -y装完之后用git --version验证。这里要说一个很重要的点apt和yum仓库里的Git版本往往落后于官方最新版。比如Ubuntu 20.04自带的Git是2.25.x而现在官方早就到了2.4x。对于大部分人来说系统自带的版本足够用没有必要追求最新。但如果你需要用到新版本才有的特性——比如git switch和git restore这类相对新一些的命令2.23引入或者init.defaultBranch这个配置项2.28才引入——那就得确认一下自己装到的版本够不够。2.2 源码编译安装需要最新版时的方案当系统仓库里的Git版本太老而你又确实需要新特性时源码编译是唯一靠谱的路。整个过程不复杂但有几个细节需要注意。先去Git官方仓库下载源码包或者直接用git clone拉下来sudo apt install make gcc libssl-dev libcurl4-openssl-dev zlib1g-dev libexpat1-dev -y wget https://github.com/git/git/archive/refs/tags/v2.45.2.tar.gz tar -zxvf v2.45.2.tar.gz cd git-2.45.2 make configure ./configure --prefix/usr/local make -j$(nproc) sudo make install依赖里libssl-dev对应Git的HTTPS支持libcurl4-openssl-dev对应远程仓库交互zlib1g-dev和libexpat1-dev分别对应压缩和解析。这些依赖缺了的话编译出来的Git在后续使用中会报各种莫名其妙的功能缺失错误。编译安装完成后git --version如果显示的还是老版本那多半是因为/usr/bin/git在系统的PATH里比/usr/local/bin靠前。用which git看一下实际路径必要时把/usr/local/bin调整到PATH前面或者干脆用sudo ln -sf /usr/local/bin/git /usr/bin/git做软链接覆盖。2.3 安装后的环境检查装完Git不代表万事大吉我习惯立刻做三件事。第一是确认版本号git --version第二是看配置文件存在没有ls -la ~/.gitconfig正常情况下这个文件第一次配置之前是不存在的第三是跑一遍git config --system --list看系统级的配置有没有被发行版预设过——很多Linux发行版确实会在/etc/gitconfig里预设一些默认值比如Ubuntu上会有init.defaultbranchmaster这样的老配置提前知道这些能避免后续困惑。提示如果你是在容器或者虚拟机里配Git安装之前记得先确认基础环境。很多精简容器镜像连curl、ca-certificates都没有Git能装上但访问HTTPS远程仓库时会报SSL证书错误。sudo apt install ca-certificates curl -y这类基础包建议顺手装好。3. 基础配置让Git知道你是谁、想干什么3.1 用户身份配置第一条该执行的命令安装完Git后第一对要配的肯定是用户名和邮箱。这不仅是提交记录上的署名问题更是Git正常运行的基础依赖——不配用户名和邮箱git commit直接就会报错根本没机会把提交写进去。git config --global user.name 你的名字 git config --global user.email 你的邮箱example.com这里有个容易忽略的细节提交记录里显示的邮箱最好跟你的代码托管平台GitHub、GitLab、Gitee等账号邮箱保持一致。否则你的提交虽然推上去了但在平台的贡献图上显示不出来——那些绿色小方块之所以空着很多时候不是你没提交而是提交用的邮箱跟账号对不上。我当年因为这个原因整整一个月“贡献度全勤但贡献图全白”排查到最后才发现是邮箱配了个不常用的。另外强调一点--global的意思是这台机器上当前用户所有仓库都默认用这个身份。如果你在公司电脑上同时处理私人项目和公司项目建议私人项目在仓库内用--local单独配私人邮箱避免把私人邮箱留在公司项目的历史记录里。3.2 默认编辑器、默认分支名人类跟Git交互最频繁的除了命令行本身就是每次提交时要写的提交信息。默认情况下Git会调用/etc/alternatives里设定的系统编辑器很多Linux服务器上这个编辑器是nano或者vi。我个人习惯了vim所以会显式指定git config --global core.editor vim如果你根本不想跟编辑器纠缠只想在命令行里直接写提交信息可以用git commit -m。但对于合并提交、git revert这类需要默认唤起编辑器的场景指定一个自己顺手的编辑器还是很有必要的。默认分支名方面现在新版本Git的默认设置已经改成了main但老版本或者被发行版预置了老配置的机器上依然会创建master分支。统一改成maingit config --global init.defaultBranch main我建议所有新环境都加上这一条。现在远程平台新建仓库的默认分支都是main本地创建仓库默认分支如果还是master推送到远程时就要多一步git branch -M main的重命名操作虽然不麻烦但配好之后省心很多。3.3 换行符与文件权限Linux上最容易被坑的两处跨平台协作是最容易暴露Git默认配置短板的地方。Windows上文件换行符是CRLF\r\nLinux和macOS上是LF\n。如果不对Git做任何设置Git会把仓库里的文件按原本的换行符存储checkout到工作区时按平台习惯自动转换。这个设计本意是好的但实际协作中经常出现“我明明只改了一行git diff却显示整个文件都变了”的情况根因就是Windows和Linux之间的换行符转换把整个文件的每一行都标记成了变更。标准解决方案是在仓库根目录放一个.gitattributes文件把关键文件的换行符规则显式固定下来* textauto *.py text eollf *.js text eollf *.md text eollf *.sh text eollf *.bat text eolcrlftextauto的意思是让Git根据文件内容自动判断是否为文本文件文本文件在入库时统一转换成LF存储checkout时再根据平台特性决定是否转换。然后针对特定类型文件强制指定eollf这样不管谁在哪个平台提交仓库里和本地工作区的换行符都是确定的。如果项目里不方便统一加.gitattributes退而求其次可以在全局做一层缓解git config --global core.autocrlf inputinput表示提交时把CRLF转成LF入库checkout时不做转换。这是Linux端比较稳妥的设置至少能保证入库的换行符是统一的LF。另一个Linux特有的坑是文件权限。默认情况下Git会追踪文件的执行权限但这在Windows和Linux协作的项目里经常造成困扰Windows上的人没执行权限概念Linux上clone下来发现很多无意义的权限变更。如果你确信项目里的人不需要通过Git来同步执行权限位可以设置git config --global core.fileMode false这会让Git忽略工作区文件的可执行位变化只关心内容变化。对纯代码项目来说这个设置基本是必加的能避开一大堆无意义的diff噪音。4. 提高效率的进阶配置4.1 别名配置把高频命令缩短到指尖Git命令行有个别的工具比不了的强大之处但也正因为命令太多太全常用操作往往显得冗长。git checkout七个字母git commit --amend要敲十几二十个字符。配置别名是投入产出比最高的一件事。以下是我个人常用的别名配置直接复制即可用git config --global alias.co checkout git config --global alias.br branch git config --global alias.st status git config --global alias.lg log --oneline --graph --all --decorate git config --global alias.last log -1 HEAD --stat git config --global alias.unstage reset HEAD -- git config --global alias.undo reset --soft HEAD^ git config --global alias.cm commit -m git config --global alias.amend commit --amend这里面性价比最高的是lg。每次敲git lg提交历史会以图形化的方式完整呈现分支分叉、合并节点、HEAD位置、标签一眼扫过去比任何GUI工具都直观。我见过很多同事用git log --oneline凑合结果分支复杂之后完全看不清拓扑关系换成git lg之后立刻舒坦。undo是另一个实用工具它的作用是撤销最近一次提交但保留工作区改动相当于“不小心提交了把提交撤回来重新来”。注意--soft撤销提交但保留暂存区的内容而reset --mixed默认撤销提交也撤销暂存。用undo的场景一般是提交信息写错了或者漏了一个文件撤销完重新git cm一次即可非常顺滑。4.2 SSH密钥配置免密推送的关键绝大多数使用者在HTTPS推送时会被反复要求输入用户名密码而SSH模式配置好之后可以一劳永逸。整个流程分三步生成密钥、添加公钥到平台、测试连接。生成密钥ssh-keygen -t ed25519 -C 你的邮箱example.com一路回车默认会生成在~/.ssh/id_ed25519和~/.ssh/id_ed25519.pub两个文件。ed25519算法是现在比较推荐的安全性高、密钥短、生成速度快。如果你的系统或者平台不支持ed25519极少见退回到ssh-keygen -t rsa -b 4096也行。生成之后把公钥内容加到平台账户里。以GitHub为例路径是Settings - SSH and GPG keys - New SSH key把~/.ssh/id_ed25519.pub里的内容粘贴进去保存。其他平台如GitLab、Gitee都有类似入口。之后测试连接ssh -T gitgithub.com能回复Hi username! Youve successfully authenticated, but GitHub does not provide shell access.就说明通了。然后把远程仓库地址从HTTPS换成SSH格式git remote set-url origin gitgithub.com:用户名/仓库名.git这里有三个极易踩的坑我逐一说明。第一是权限。~/.ssh目录必须是700私钥文件必须是600公钥文件至少644。权限太宽松会让SSH客户端直接拒绝使用你的密钥报错信息往往很隐晦像bad permissions。修正方法chmod 700 ~/.ssh chmod 600 ~/.ssh/id_ed25519 chmod 644 ~/.ssh/id_ed25519.pub第二是多个平台多套密钥的管理。如果你同时用GitHub和公司内网的GitLab可以给每套平台单独生成密钥并在~/.ssh/config里按Host区分。简单场景下用ssh-keygen -t ed25519 -C xxx -f ~/.ssh/id_ed25519_github生成不同文件名在config文件里写Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519_github第三是SSH连接超时问题。某些内网环境对SSH出站有限制ssh -T gitgithub.com一直卡住不动排查时可以加-v参数看详细连接日志能确认是DNS解析问题还是TCP连接问题。4.3 凭据存储HTTPS模式的次优解虽然SSH模式是Linux下推荐的远程交互方式但有些场景比如公司强制用HTTPS端口访问Git服务器绕不开HTTPS。这时候合理配置凭据存储能省掉每次输入账号密码的重复劳动。Git提供的凭据存储机制有三种cache把密码存在内存里一段时间默认900秒即15分钟store把密码明文存放在~/.git-credentials还有各平台特定的manager。我推荐在Linux下用cache配合一个较长的时间窗口git config --global credential.helper cache --timeout3600设置成3600秒1小时也就是说1小时内第一次push输过一次密码后后续push不再询问。对于一天内高频操作但又不希望密码长期暴露在磁盘上的场景这个方案最均衡。store方案虽然一劳永逸但密码明文存放在家目录下安全性隐患很大。如果一定要用建议至少把~/.git-credentials的文件权限改成600。另外提醒一句如果用的是公司内网的Git服务密码存储明文可能违反安全规范上岗前先确认合规性。4.4 全局gitignore和常用模板每个项目都要写.gitignore每次都要从网上复制一份模板配置一个全局忽略规则可以消灭这些重复劳动。全局ignore文件里的规则对当前用户的所有仓库生效。git config --global core.excludesfile ~/.gitignore_global然后在~/.gitignore_global里写入常用规则# 系统文件 .DS_Store Thumbs.db # 编辑器 .vscode/ .idea/ *.swp *.swo # 日志和临时文件 *.log *.tmp *.bak # 编译产物 target/ build/ dist/ *.class *.jar注意全局ignore不能替代项目级.gitignore——项目级的.gitignore会跟随仓库分发给其他协作者而全局ignore只对你自己生效适合放那些只有你在意的个人噪音文件。还有一个实用配置是默认情况下让git status不显示未跟踪的目录内容只显示目录名。大批量新增目录时git status输出会非常冗长git config --global status.short true如果你经常面对特别大的仓库还可以考虑git config --global core.compression 1把压缩等级调低换取更快的读写速度。对大仓库有明显的性能改善代价是仓库文件在本地占用的空间略大。5. 常见问题与排查技巧实录5.1 commit --amend的误用场景与正确姿势git commit --amend是一个功能强大但危险系数不低的命令。它常用在两个场景一是修改最近一次提交的提交信息比如手滑写错字了二是把新改动补进最近一次提交让历史保持整洁。修改提交信息git commit --amend -m 正确的提交信息补加文件git add 漏掉的文件 git commit --amend --no-edit--no-edit表示保留原提交信息。这个用法很适合“刚才漏了一个文件但不想重开一次提交”的场景。但这里有一个必须时刻警惕的红线如果这个提交已经push到了远程仓库而且其他人已经基于它做了分支千万不要amend。amend本质上是“用一个新的提交替换掉旧的提交”——老提交被“重写”成新提交commit哈希完全变了。别人如果已经拉取过老提交他们的历史跟你的历史就对不上了后续push会被拒强行git push --force则可能覆盖别人的工作成果。我在实际工作中吃过这个亏一个共享分支上我手滑amend了一个别人刚拉取的提交然后force push上去导致同事分叉最后几个人凑在一起花了大半个小时才把历史捋顺。从那之后我给自己立了一条规矩公共分支上的提交哪怕信息写错了也绝不用amend老老实实再补一个git commit --amend不碰而是用git commit -m 修正xxx追加一条新提交。如果确实需要修改历史且确认影响范围可控优先用git rebase -i配合reword指令去做至少能清晰地看到要改动哪几条提交。5.2 分支合并的两种方式和冲突处理分支合并是Git用得最多的操作之一git merge和git rebase两种方式各有适用场景但大多数人没真正理解它们的区别。git merge会创建一个合并提交保留两个分支的完整历史分支拓扑在git lg里呈现出清晰的交汇点。它的优点是安全、保留现场缺点是历史会多出“分叉-合并”的痕迹对追求线性历史的团队来说显得杂乱。git rebase则是把当前分支的提交逐一“摘下来”重新重放到目标分支的最新节点之后。它在git lg里呈现为一条直线历史非常干净。但代价是提交哈希会变被rebase的分支等于被重写了——所以它同样有“公共分支别乱rebase”的铁律。在合并冲突的处理上我的经验排序是先看git status确认哪些文件冲突打开冲突文件搜索、、这几个标记对应的是当前分支、分隔线、所合并分支的内容手工修改成想要的结果删掉所有冲突标记git add修改过的文件merge场景执行git commitrebase场景执行git rebase --continue。一个实用技巧是修改冲突文件时用git diff配合看上下文特别是git diff --theirs和git diff --ours分别查看两个版本的具体改动能帮助你判断哪边的修改才是真正需要的。不要把两边内容做无脑拼接——冲突通常代表两边的修改在语义上有交叉直接把两段都保留往往会造成逻辑重复。另外强烈建议在rebase过程中随时准备回退。git rebase --abort可以在任何冲突处理不下去的时候回到rebase之前的状态这一点比merge更有退路。5.3 中文文件名显示成八进制的问题Linux环境下Git默认对非ASCII字符做转义处理中文文件名在git status里显示成\346\265\213\350\257\225这类八进制序列看着十分别扭。解决办法很简答git config --global core.quotepath false之后中文文件名就能正常显示了。这个配置我已经写进所有新环境的配置清单里遇到过很多从Windows切到Linux的同事第一次看到八进制文件名时都以为是文件名被弄坏了。需要说明的是fileMode false对权限位变更就不追踪了如果项目里有脚本依赖可执行位要在.gitattributes或仓库内单独开关。5.4 凭据过期与权限报错的排查思路配置完SSH之后出现Permission denied (publickey)是最常见的问题。我的排查顺序是先ssh -T gitgithub.com -v看详细输出确认用到的密钥文件是哪个再看~/.ssh权限是不是松了之后检查github账号里公钥是否添加正确最后确认remote地址用的是SSH格式而不是HTTPS格式。如果某个仓库的remote地址之前用过HTTPS又被改成SSH可能出现本地记住了旧凭据的情况。用git remote -v检查地址用git config --local --unset credential.helper清除仓库级凭据缓存一般都能解决。5.5 为什么会提示“detected dubious ownership in repository”Git近期版本在Linux下遇到某些仓库目录权限归属不正常时会直接拒绝操作报detected dubious ownership in repository错误。这通常发生在clone仓库的用户跟当前操作的用户不一致或者目录是通过sudo创建导致属主是root。一个常见的触发场景是从服务器上把整个工作目录打包拷到本地或者用root用户clone了一份仓库再切到普通用户去操作。解决办法有两种一种是规范目录归属用chown -R 当前用户:当前用户组 仓库目录把目录还回来另一种是嫌麻烦直接告诉Git信任这个目录git config --global --add safe.directory /路径/到/仓库我个人的建议是首选chown因为safe.directory加多了之后哪天机器被入侵或环境被误改Git的安全防护等于被手动拆掉了。个人实际使用中的几点体会把配置做完之后我最明显的感受是Git从“能用”变成了“好用”。以前每次推送都输密码、每看一次log都嫌乱、每遇到一次冲突都头皮发麻配置理清之后这些摩擦全消了。尤其是git lg别名和SSH密钥这两项几乎是立竿见影地提升了日常操作效率。还有一个小技巧值得分享把配置文件纳入版本管理。我自己维护了一份.gitconfig和.gitignore_global放在一个私有仓库里换新机器或者新服务器的时候直接拉下来复制到家目录再执行一下git config --global里那些依赖具体环境的设置十分钟就能把新环境配好不需要从零开始回忆。如果你经常在不同机器之间切换强烈建议也这么做。Git的配置不是一次性的随着使用习惯的变化配置也会慢慢演进。每当你觉得某个操作“怎么这么麻烦”的时候大概率就是有一个配置项能解决它——动手查一查、配一配积少成多最后形成的配置清单就是你个人的Git使用习惯的完美映射。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门