git clone走错ssh密钥是因为ssh客户端默认只用~/.ssh/id_rsa,需通过~/.ssh/config配置host别名映射域名与对应identityfile,且git远程url必须改用该别名(如git@github-personal),否则无法触发路由规则。

为什么git clone总走错SSH密钥?
因为 Git 本身不管理 SSH 密钥,它只通过 SSH 客户端(ssh)连接远程仓库;而 ssh 默认只用 ~/.ssh/id_rsa。你配了多个密钥,但没告诉 ssh「哪个域名该用哪个密钥」,它就永远只试第一个——结果就是权限拒绝(Permission denied (publickey))。
关键不在 Git 配置,而在 ~/.ssh/config 的 Host 别名路由规则。
- 每个 GitHub/GitLab 账号必须对应一个独立的 SSH key 对(不能共用
id_rsa) - 远程 URL 必须改用自定义 Host 名(如
github-personal),不能继续用git@github.com -
ssh -T git@github.com这类直连测试会失败——它绕过了~/.ssh/config的路由逻辑
怎么生成并绑定多个 SSH 密钥?
用 -f 指定密钥路径,-C 加邮箱注释(仅作标识,不影响功能):
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_personal -C "me@personal.com" ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_work -C "me@company.com"
然后在 ~/.ssh/config 中写明 Host 映射和密钥路径:
Host github-personal HostName github.com User git IdentityFile ~/.ssh/id_ed25519_personal <p>Host github-work HostName github.com User git IdentityFile ~/.ssh/id_ed25519_work
- Host 名(如
github-personal)是你自己起的别名,后续所有 Git 操作都得用它 -
HostName是真实域名,User固定为git(GitHub/GitLab 均如此) - 不要漏掉
IdentityFile的完整路径,波浪号~在 config 里不展开,得写成/home/you/.ssh/...或用$HOME
Git 仓库 URL 怎么切到对应用户?
克隆或修改 remote URL 时,把 git@github.com:user/repo 换成你定义的 Host 别名:
git clone git@github-personal:user/repo.git git remote set-url origin git@github-work:org/repo.git
验证是否生效:
ssh -T git@github-personal # 应显示 Hi xxx! You've successfully authenticated... git config --get remote.origin.url # 确认输出是 git@github-work:... 而非 git@github.com
- 已存在的仓库必须手动
git remote set-url,Git 不会自动识别你新配的 Host - 如果 push 仍报权限错,先运行
ssh -vT git@github-personal看日志里实际加载了哪个IdentityFile - 别在
.git/config里硬编码sshCommand = ssh -i ...——这会覆盖~/.ssh/config,且无法按 Host 区分
为什么git push有时还是用错密钥?
最常见原因是:URL 里混用了原始域名和自定义 Host。比如 remote 设置成 git@github.com:user/repo,但你期望它走 github-personal 规则——不可能,ssh 根本不会查 config。
另一个隐蔽坑:~/.ssh/config 文件权限太宽松(如 644),ssh 会直接拒绝读取:
chmod 600 ~/.ssh/config chmod 600 ~/.ssh/id_ed25519_*
- Windows WSL 用户注意:Windows 文件系统挂载点下的
~/.ssh可能因 NTFS 权限导致 chmod 失效,建议把密钥放在 Linux 原生分区 - 公司 GitLab 自托管实例若用了非标准端口(如 2222),要在 config 里加
Port 2222 - 别依赖
ssh-agent的自动加载——它只缓存已用过的密钥,首次连接仍靠 config 指引
Git 多用户本质是 SSH 层的路由问题,不是 Git 配置问题;一旦 Host 别名、URL、config 三者对不上,就会静默 fallback 到默认密钥——而这个过程没有任何提示。
© 版权声明
本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报。
本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
文章版权归原作者所有,本站只做转载和学习。
声明:下载本站资源即同意用户协议,本站程序只是提供给开发者学习研究。
本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报。
本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
文章版权归原作者所有,本站只做转载和学习。
声明:下载本站资源即同意用户协议,本站程序只是提供给开发者学习研究。
THE END





