很多人在Win11上折腾Git连Gitee,第一反应就是去网上搜"git配置gitee密钥",结果搜出来的教程要么年代久远,要么步骤残缺,照着做完还是报Permission denied (publickey)。这篇文章我把从零到能正常git clone和git push的完整链路写清楚,包括SSH Key的生成原理、配置到Gitee的具体位置、Win11下容易被忽略的系统设置,以及我踩过的坑和排查思路。内容覆盖从Git安装到最后多仓库共存,不管你是刚接触Git的新手,还是被SSH问题卡住的老手,顺着往下走基本都能解决。
1. 动手前的环境准备与Win11几个坑
1.1 为什么Win11下配SSH Key值得单独写一篇
先说个现象:很多人在Win10上配SSH Key很顺利,换到Win11就各种不顺。这不是玄学,是Win11确实改动了一些底层设置。比如右键菜单默认收起、自带终端从cmd换成了Windows Terminal、OpenSSH客户端变成了可选功能,甚至首次连Gitee时会弹防火墙授权,处理不好直接超时。另外Win11对用户目录权限管得更严,如果你把密钥文件放在C:\Users\你的用户名\.ssh下,不注意权限设置,SSH客户端就会直接拒绝使用这个密钥。
这一篇就围绕Win11环境来讲,把每一步能遇到的问题都提前说明白,省得你去翻十几个帖子拼答案。
1.2 Git在Win11的安装与初始配置
Gitee本身是基于Git的代码托管平台,所以第一步肯定是把Git装好。去Git官网下载Windows版本,安装包一路Next就能装完。有几个选项需要注意:
- 安装路径建议保持默认,如果改了,注意路径里不要出现中文和空格。
- 在选择默认编辑器那一步,如果你不熟悉Vim,建议选Notepad++或者VS Code,方便后面提交代码时编辑提交信息。
- 在调整PATH环境变量那一步,选默认的“Git from the command line and also from 3rd-party software”就行。
- 换行符转换那一步,选默认的“Checkout Windows-style, commit Unix-style line endings”,这是Windows下最省心的方案。
安装完验证一下是否成功,打开任意终端窗口(Win11推荐在文件夹地址栏输入cmd或者直接在开始菜单搜索“终端”),输入:
git --version能正常输出版本号,比如git version 2.40.0.windows.1,就说明安装成功。
紧接着设置全局用户信息,这是Git提交时必须携带的信息,不设置的话提交时会报错:
git config --global user.name "你的名字" git config --global user.email "你的邮箱"这里有个细节:user.name和user.email会写进每一次commit里,Gitee也会根据邮箱匹配到你的账号。所以邮箱最好填Gitee注册时用的邮箱,这样提交记录能正确关联到你的Gitee头像。
1.3 Win11下终端和右键菜单的几个小坑
Win11和Win10在终端使用上最明显的区别就是右键菜单。Win11默认右键是精简菜单,里面没有“Git Bash Here”和“在终端中打开”。你需要在右键菜单底部找到“显示更多选项”,才能看到传统的完整菜单。这一步有几种解决办法:
- 安装Git时勾选“Windows Explorer integration”,会在右键菜单的“更多选项”里加入“Git Bash Here”和“Git GUI Here”。
- 用Win11自带终端:在文件夹空白处按
Ctrl + Shift + 右键,会直接在当前目录打开Windows Terminal。 - 也可以在文件夹地址栏输入
powershell回车,直接在该路径打开PowerShell窗口。
另外Win11默认把终端从cmd换成了Windows Terminal,如果你初次打开看到的界面和网上老教程不一样,不用慌,功能是兼容的。后面所有命令在cmd、PowerShell、Windows Terminal、Git Bash里都能跑,只是个别命令的语法略有差异,我会在文里标注。
还有一个容易被忽略的点:Win11的OpenSSH客户端默认可能没被启用。检查方式是打开“设置 → 系统 → 可选功能”,看看“OpenSSH 客户端”是否已安装。如果没装,点击“添加可选功能”搜索并安装。这个组件缺失会导致你输入ssh命令时提示“无法识别”。
2. SSH Key生成与Gitee配置全流程
2.1 生成SSH Key到底在做什么
很多人照着教程敲完ssh-keygen就复制粘贴,但不知道这一堆操作到底在干什么。简单说,SSH Key是一对非对称加密密钥:一个是私钥,留在你电脑里绝不外传;一个是公钥,可以放心地贴到Gitee后台。Gitee通过公钥来识别“你用这台电脑访问是合法的”,而私钥用来证明“你确实是持有该公钥的人”。
Git支持的密钥算法有好几种,常见的有RSA和ED25519。RSA是老牌算法,兼容性最好,但4096位的密钥比较长,生成和验证都慢一些。ED25519是近几年流行的算法,密钥短、速度快、安全性也足够,Git 2.31以后和Gitee都支持。我个人的建议是优先用ED25519,除非你手上有老系统或老客户端的兼容性要求。
生成密钥的命令如下,建议至少加上-C注释参数,方便以后区分这个密钥是哪台电脑、干什么用的:
ssh-keygen -t ed25519 -C "your_email@example.com"想用RSA的话:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"执行后会有几步交互:
- 第一次提示
Enter file in which to save the key,让你选择密钥文件保存位置。一般默认C:\Users\你的用户名\.ssh\id_ed25519,直接回车即可。 - 第二次提示
Enter passphrase,这是给私钥加一层密码保护。建议设一个,即使私钥泄露,别人没有这个密码也使用不了。当然如果你觉得每次操作都要输密码太烦,可以留空,但安全性会打折。 - 第三次确认密码。
完成后在.ssh目录下会生成两个文件:私钥(无后缀)和公钥(.pub后缀)。.pub文件是你需要给Gitee的。
2.2 私钥放哪、公钥贴哪——两个关键位置
私钥的位置刚才说了,默认在C:\Users\你的用户名\.ssh\下。这里有个Win11容易踩的坑:.ssh目录的权限。如果私钥文件的权限设置得过于宽松,比如其他用户也能读取,OpenSSH客户端会直接拒绝使用该密钥,报UNPROTECTED PRIVATE KEY FILE之类的错误。
解决办法是在文件属性里收紧权限:右键私钥文件 → 属性 → 安全 → 高级 → 禁用继承 → 将继承的权限转换为显式权限 → 然后只保留当前用户,删除其他用户条目。
如果嫌图形界面麻烦,也可以用命令快速设置(在PowerShell或终端里执行):
icacls "$env:USERPROFILE\.ssh\id_ed25519" /inheritance:r /grant:r "$env:USERNAME:F"再说公钥要贴到哪里。登录Gitee网页端,进入“头像 → 设置 → 安全设置 → SSH公钥”。把.pub文件内容复制进去。公钥内容通常以ssh-ed25519 AAAA...或ssh-rsa AAAA...开头,粘贴时不要漏掉最后的邮箱注释,也不要加多余空格。
Gitee每个账号可以添加多个公钥,也就是说你可以把家里电脑、公司电脑、笔记本的公钥都加进去,用哪个都行。公钥本身不敏感,泄露了也不会让人直接登录你的Gitee账号,但为了安全还是不建议随处粘贴。
2.3 验证配置是否成功
配置完公钥,别急着克隆仓库,先验证一下能否连接上Gitee的SSH服务。在终端里执行:
ssh -T git@gitee.com首次连接会提示确认服务器指纹:
The authenticity of host 'gitee.com (IP地址)' can't be established. ED25519 key fingerprint is SHA256:xxx. Are you sure you want to continue connecting (yes/no)?输入yes回车即可,这个指纹信息会记入known_hosts文件,下次不再询问。之后如果看到类似于Hi 用户名! You've successfully authenticated, but GITEE.COM does not provide shell access.的内容,就说明SSH Key配置成功了。
如果这里报错,别急着往下走,先根据错误信息排查。最常见的Permission denied (publickey)就是Gitee没有匹配到你的公钥,或者私钥路径没有正确识别。我会在第5节详细讲排查方法。
3. Win11下克隆与拉取Gitee仓库的实战步骤
3.1 从HTTPS切换到SSH:两种仓库地址的选择
Gitee上的每个仓库都有两种远程地址:HTTPS和SSH。HTTPS地址形如https://gitee.com/用户名/仓库名.git,SSH地址形如git@gitee.com:用户名/仓库名.git。
很多教程默认让你用HTTPS克隆,因为不需要配置任何东西。但HTTPS有两个痛点:一是推送代码时需要反复输入Gitee的用户名密码,虽然Win11自带凭据管理器可以记住,但首次还是要输;二是如果你开了两步验证,HTTPS方式还会因为密码校验问题反复被拒。SSH的优势就是配置一次,之后推送拉取都不用输密码。
如果你之前已经用HTTPS克隆过仓库,想改成SSH,在仓库目录下执行:
git remote set-url origin git@gitee.com:用户名/仓库名.git然后git remote -v确认一下地址是否切换成功。
3.2 完整实操:克隆、修改、提交、推送
现在从头走一遍流程。假设Gitee上已经有一个仓库叫my-project,我在本机把它克隆下来:
git clone git@gitee.com:用户名/my-project.git这一步会使用你第2节配置的SSH Key来做认证。如果本地路径下没有私钥文件,或者Gitee上没有对应的公钥,都会在这里报错。
克隆完成以后,进入项目目录,正常开发。改完代码以后,标准的提交推送流程是:
git add . git commit -m "提交说明" git push这里的git push默认推送到origin远程仓库的当前分支。如果你刚初始化仓库,可能会有两步提示:首次推送需要指定上游分支,执行git push -u origin master或git push -u origin main即可。之后就能直接git push了。
拉取远程更新的代码用:
git pullgit pull相当于git fetch加git merge,把远程最新的提交拉下来并合并到本地。如果本地有未提交的修改,可能会产生冲突或要求你先stash,这种情况我会在第5节展开说。
3.3 让ssh-agent记住密码:Win11下开机自动启动
如果你在生成密钥时设置了passphrase(私钥密码),那么每次用SSH操作Git时都会要求输入这个密码。这很安全但也很烦。解决办法是用ssh-agent把这个密码记住。
ssh-agent是OpenSSH自带的一个后台程序,专门用来保存已解锁的私钥。在Windows上它是作为一个Windows服务存在的,服务名叫“OpenSSH Authentication Agent”。默认情况下这个服务可能是停止且禁用状态的,需要手动启用。
启用方式有两种:
第一种,图形界面。按Win + R,输入services.msc回车,找到“OpenSSH Authentication Agent”,双击,把启动类型改成“自动”,然后点击“启动”。
第二种,命令行。用管理员身份打开PowerShell:
Set-Service -Name ssh-agent -StartupType Automatic Start-Service ssh-agent启用后,把一个私钥加入ssh-agent:
ssh-add "$env:USERPROFILE\.ssh\id_ed25519"这时会要求输入一次passphrase,输入之后ssh-agent会记住这个私钥。之后在同一用户会话内执行SSH操作就不再需要输入密码了,重启电脑后需要重新ssh-add一次(所以服务设为自动启动也只是减少了手动步骤,解锁还是要一次)。
从Win11的角度说,比较推荐把ssh-agent设置成自动启动,不然每次重启后都要重新加载私钥。设置一次,后面所有Git操作都顺畅很多。
4. 多账号、多仓库场景下的SSH配置
4.1 一个Gitee账号多台电脑
这个场景其实最简单。一台电脑生成一对密钥,把公钥添加到Gitee账号下即可。Gitee允许一个账号添加多个公钥,所以你在家、在公司、在笔记本上分别生成密钥并添加,互不干扰。删除某一台电脑的访问权限时,只需要在后台删掉对应公钥,操作非常灵活。
但这里有个常见误区:有些人会以为每台电脑都要用同一套密钥。其实完全没有必要,而且不建议这么做。每台电脑一套独立密钥是更安全更有管理的做法,哪台电脑出了安全问题,单独吊销那台电脑的公钥就行。
4.2 一台电脑同时配置Gitee、Github等平台
这个场景是真正的重头戏。很多人一台电脑既要用Gitee,又要用GitHub或其他代码托管平台,如果每个平台都用默认密钥,最后只会保留一个,另一个连连失败。解决办法是为不同的平台生成不同的密钥文件,然后通过~/.ssh/config文件来区分。
首先,逐个生成密钥,注意指定文件名:
ssh-keygen -t ed25519 -C "用于Gitee" -f ~/.ssh/gitee_id_ed25519 ssh-keygen -t ed25519 -C "用于GitHub" -f ~/.ssh/github_id_ed25519然后,在.ssh目录下新建或编辑config文件(没有就新建,无后缀名):
Host gitee.com HostName gitee.com User git IdentityFile ~/.ssh/gitee_id_ed25519 Host github.com HostName github.com User git IdentityFile ~/.ssh/github_id_ed25519配置完成后,分别测试:
ssh -T git@gitee.com ssh -T git@github.com两个都能返回成功提示,说明SSH已经能根据不同域名自动选择对应密钥。
再补充一个容易被忽略的点:Git的提交作者信息(user.name和user.email)是全局的,如果你在Gitee和GitHub用的是不同邮箱,提交到不同平台时,作者信息可能对不上。解决办法是在每个仓库目录下单独设置局部配置:
git config user.name "Gitee用户名" git config user.email "Gitee注册邮箱"这样局部配置会覆盖全局配置,确保提交记录归属于正确的账号。
4.3 免密登录相关的安全细节
SSH Key免密的便利性显而易见,但代价是只要私钥泄露,别人就能冒充你操作代码仓库。几个安全习惯值得养成:
- 私钥文件不要同步到网盘、云盘、公开仓库。
- 给私钥设置passphrase,配合ssh-agent使用,兼顾安全和便利。
- 定期在Gitee后台检查SSH公钥列表,删掉不认识的条目。
- 如果怀疑私钥泄露,立刻在后台删除对应公钥并重新生成密钥。
- 换电脑后,旧电脑上的私钥如果不再使用,建议后台删掉对应公钥。
5. 常见问题排查与避坑实录
5.1 最常遇到的现象级报错
| 报错信息 | 可能原因 | 解决方案 |
|---|---|---|
| Permission denied (publickey) | 公钥未添加到Gitee,或ssh-agent没有加载私钥 | 检查Gitee后台公钥;ssh-add -l确认私钥列表 |
| Host key verification failed | 首次连接未确认指纹,或known_hosts内容异常 | 删除~/.ssh/known_hosts中对应条目后重新连接 |
| UNPROTECTED PRIVATE KEY FILE | 私钥文件权限过宽,Win11更严格 | 用icacls命令收紧权限 |
| Could not open a connection to your authentication agent | ssh-agent服务未启动 | 在服务中启用OpenSSH Authentication Agent |
| git@gitee.com: Permission denied (publickey,password) | 密钥认证失败后回落到密码认证 | 和第一条一致,重点查公钥和密钥路径 |
| repository not found | 仓库路径错误,或没有该仓库访问权限 | 检查仓库地址拼写;确认账号是否有仓库权限 |
| 端口22连接超时 | 防火墙拦截SSH连接 | 检查防火墙放行22端口;或改用Gitee备用SSH端口443 |
最后一个“端口22连接超时”值得多说两句。有些办公网络或校园网会封禁22端口,导致SSH连接失败。Gitee为此提供了备用的SSH端口443,使用方式是把SSH地址改为ssh -T -p 443 git@gitee.com,克隆地址改为ssh://git@gitee.com:443/用户名/仓库名.git。端口能通的话,这也是一种备选方案。
5.2 Win11系统相关的特有踩坑
Win11下有几个坑在教程里很少被提到,我在这里挨个说明。
第一个坑是首次ssh -T git@gitee.com时,Win11会弹出Windows防火墙授权窗口。如果你不小心点了“取消”,后续所有SSH连接都会被防火墙拦截。解决办法是手动放行:打开“Windows安全中心 → 防火墙和网络保护 → 允许应用通过防火墙”,找到Git相关的条目,确保“专用”和“公用”都勾选,然后手动执行一次SSH连接触发规则。
第二个坑是终端编码问题。在中文版Win11下,Git Bash默认显示中文正常,但PowerShell和Windows Terminal有时会出现中文乱码。这个一般不影响Git操作本身,但如果你在git commit信息里写了中文,推送到Gitee后页面显示乱码,大概率是提交信息编码设置不对。可以在Git中设置:
git config --global i18n.commitencoding utf-8 git config --global i18n.logoutputencoding utf-8第三个坑是换行符(CRLF/LF)。Windows下默认换行符是CRLF,Git在提交时会根据配置转换成LF,检出时再转回CRLF。如果你在.gitattributes里没有做统一约束,可能会出现warning: LF will be replaced by CRLF的提示,这是正常的,不影响使用。但如果整个团队在Windows和Mac/Linux之间协作,建议在仓库根目录添加上下文相关的.gitattributes文件,统一管理换行符规范。
第四个坑是Win11的用户目录路径。如果你的Windows用户名是中文(比如C:\Users\张三),有些老版本Git工具可能不支持含中文的路径,导致密钥加载失败或仓库操作异常。解决办法有几种:一是建议使用英文用户名(但改名比较麻烦);二是把密钥和仓库放在非中文路径下;三是升级到最新版Git。现在新版Git对Unicode路径的支持已经比较好了,但中文路径踩坑的案例仍然存在,所以有条件的话尽量别用中文用户名。
5.3 我日常使用中的几个小习惯
这里分享几个我自己长期用下来的习惯,踩过几次坑之后总结出来的,可能对你也有帮助。
第一,~/.ssh目录下的文件命名一定要有辨识度。我见过不少人所有平台的密钥都叫id_rsa,换平台时互相覆盖,最后不知道哪个公钥是哪个平台的。我现在统一用平台_用途_环境的格式命名,比如gitee_pc_work、github_laptop,一眼就能看出来。
第二,测试SSH连接时,多利用-v参数。ssh -vT git@gitee.com会打印详细的连接和认证过程,包括读取了哪个私钥文件、服务器接受了哪个公钥。定位问题的时候,这比盲猜有效得多。
第三,不要忽略git remote -v的输出。很多人报“推送不上去”的错,结果一查,远程地址还是HTTPS。SSH和HTTPS是两套认证体系,你在SSH配置上折腾半天,命令走的却是HTTPS通道,当然不生效。所以换地址之后一定要git remote -v确认一下。
第四,遇到问题先试ssh -T git@gitee.com而不是git clone。这个习惯能帮你把“SSH认证问题”和“Git操作问题”快速分开。SSH认证通过了,再去排查仓库地址、权限等问题,定位会快很多。
第五,定期备份~/.ssh目录下的config文件和公钥。私钥本身不建议备份到不安全的地方,但config文件记录了你所有平台的密钥映射关系,丢失后重新配置很麻烦,放到加密的密码管理器里备份是个不错的选择。
到这里,Win11下从零配置SSH Key拉取Gitee仓库的完整流程就算走完了。从Git安装、密钥生成、添加到Gitee后台,到克隆、提交、推送,再到多账号共存和常见问题排查,每一步我都尽量把“为什么这么做”和“常见坑在哪里”说清楚。SSH配置这个东西,本质上就是一次性的,只要打通一次,后面用起来会非常顺手。我个人这几年在Windows系统上配SSH的经验是:九成问题出在公钥没配对、私钥路径没指向对、ssh-agent没启动这三件事上。你只要把这三件事确认好,剩下的都是常规操作。