一句话:多平台 Git 拉代码报公钥错误,多半是 SSH 用了「错的私钥」——用 config 按 Host 指定 IdentityFile 即可。
写在前面
笔记本上同时用 Gitee、GitHub,或 TortoiseGit 能拉、命令行 git pull 却报 Permission denied (publickey),通常是 默认私钥与平台登记公钥不匹配。本篇从生成密钥、~/.ssh/config 多账号映射,到 22 端口不通时的 443 备用,一次讲清。
核心内容
初始化 Git 身份
bash
git config --global user.email "your@email.com"
git config --global user.name "your name"
多账号时可按仓库局部覆盖:
bash
git config user.email "work@company.com"
生成 SSH 密钥
bash
cd ~/.ssh
# 为 Gitee 单独生成(-f 指定文件名)
ssh-keygen -t ed25519 -C "your@email.com" -f gitee
# 为 GitHub 单独生成
ssh-keygen -t ed25519 -C "your@email.com" -f github
将 gitee.pub / github.pub 内容分别粘贴到对应平台的 SSH 公钥设置页。
简化方案:全平台共用同一对密钥(一个 id_ed25519 + .pub),维护成本最低,个人开发足够。
~/.ssh/config 多密钥映射
当不同平台使用不同私钥时,创建或编辑 ~/.ssh/config(Windows:C:\Users\<用户名>\.ssh\config):
# gitee
Host gitee.com
HostName gitee.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/gitee
# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github
目录结构示例:
~/.ssh/
gitee # 私钥
gitee.pub
github
github.pub
config
测试连接
bash
ssh -T git@gitee.com
# Hi xxx! You've successfully authenticated, but GITEE.COM does not provide shell access.
ssh -T git@github.com
# Hi xxx! You've successfully authenticated, but GitHub does not provide shell access.
22 端口被拒绝:走 443
部分网络屏蔽 SSH 22 端口,可在 config 中为 GitHub 增加:
Host github.com
Hostname ssh.github.com
Port 443
User git
测试:
bash
ssh -T -p 443 git@ssh.github.com
参考:GitHub - Using SSH over the HTTPS port
将私钥加入 ssh-agent
bash
# Mac / Linux
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/gitee
ssh-add ~/.ssh/github
# Windows(Git Bash)
eval $(ssh-agent -s)
ssh-add ~/.ssh/gitee
Windows 10+ 也可启用 OpenSSH Authentication Agent 服务,开机自动加载。
踩坑
- TortoiseGit 与命令行密钥不一致:小乌龟可在设置里指定 Pageant/私钥,命令行走
~/.ssh/config;两边要统一策略。 - VPN 切换后旧密钥混乱:多次
ssh-keygen产生多对密钥,务必在 config 里写清IdentityFile,不要依赖默认id_rsa。 - config 权限过宽:Linux/macOS 上
chmod 600 ~/.ssh/config,否则 SSH 可能拒绝读取。 - HTTPS 克隆与 SSH 混用:同一仓库 remote 应用一种协议;
git remote -v检查是否为git@github.com:...形式。 - 公司代理环境:有时需
Host *下配置ProxyCommand,与 443 方案二选一排查。
小结
- 单密钥走天下最简单;多密钥必须配
~/.ssh/config的Host+IdentityFile。 - 拉取失败先
ssh -T git@平台测认证,再查 remote URL 与公钥是否配对。 - 22 端口不通:GitHub 改用
ssh.github.com:443。


全部评论(0)