GitHub SSH 测试成功,git push 却失败
对比 Git 推送地址、SSH 程序、主机别名和密钥。认证成功还要看账号及仓库写权限,别清空全局配置。
ssh -T git@github.com 认证成功,git push 却报 Permission denied (publickey),先比较两次连接。Git 可能用了不同主机、SSH 程序或密钥,单独测试成功并不能说明推送走的是同一条配置。
先在出错的仓库查看读取与推送地址,保留原配置,不必一开始就重装 Git 或重新生成所有密钥。
查看推送地址和 SSH 命令
git remote -v
git remote get-url --push origin
git config --show-origin --get core.sshCommand
git config --show-origin --get-regexp '^url\..*\.(insteadof|pushinsteadof)$'
remote -v 分别显示 fetch 与 push 地址。单独 push URL、URL 改写或主机别名都可能造成差异;GitHub SSH 通常使用用户 git,不是自己的账号名。配置查询没有匹配项时可以返回非零状态,不表示仓库损坏。
再检查启动环境是否设置 GIT_SSH_COMMAND 或 GIT_SSH,IDE 与终端也可能不一致。输出或分享配置前隐藏带凭据的 URL,别把调试信息原样贴到公共讨论。
如果读取地址正常而 push 地址错误,记录旧值,只修改对应项。别为了试一试清空整个全局配置,那会影响其他仓库。
检查实际主机、端口和身份文件
使用 OpenSSH 时,查看 remote 中那个主机或别名的展开结果:
ssh -G github.com
ssh-add -l
关注 hostname、port、user 和 identityfile。remote 使用 github-work 就查询该别名,不能仍以 github.com 代替。agent 没有密钥不等于指定私钥文件一定不能使用,还需查看实际认证过程。
需要了解 Git 原本执行了什么,可以在可信本机对读取目标运行:
GIT_TRACE=1 git ls-remote origin
它读取引用,不推送代码;trace 可能包含路径和仓库 URL,不公开凭据。注意这验证的是读取地址,若 push URL 不同,还需沿实际推送主机配置继续检查。
已确认当前仓库应使用系统 OpenSSH 时,可以另做一次调试调用:
GIT_SSH_COMMAND='ssh -v' git ls-remote origin
这个环境变量覆盖已有 SSH 命令选择,所以它是诊断对照,并没有完整复现原来的调用。原本有指定可执行文件、包装程序或参数时,应保留相应路径与选项,再加该客户端支持的调试方式。
对比主机、端口、身份文件和提供的公钥。Windows 上 Git 自带 OpenSSH 与系统 OpenSSH 可能读取不同配置或 agent,IDE 也可能使用第三条路径;某种路径格式本身不能证明程序损坏。
22 与 443 都有合法用途
GitHub 支持通过 ssh.github.com:443 使用 SSH。日志出现这个域名,不等于配置错误;它仍是 SSH,不能改按 HTTPS 密码认证。网络确实限制 22 时,按 GitHub 443 端口说明配置并测试。
若已经确认应使用 ~/.ssh/id_ed25519 与 22 端口,可以在保留其他主机配置的前提下设置:
Host github.com
HostName github.com
Port 22
User git
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
需要 443 时按官方要求修改 HostName 与 Port,保留正确身份文件。IdentityFile 是已有私钥,不是 .pub;IdentitiesOnly 约束身份尝试,不给无权限密钥增加权限。
多账号用不同别名与密钥,让仓库 remote 对应正确别名。编辑前备份 ~/.ssh/config,编辑后再次查看展开结果。首次连接核对官方主机指纹,不以关闭主机验证作为修复步骤。
认证成功后,检查仓库写权限
GitHub 测试成功会显示账号与不提供 shell 的消息,官方说明该测试应以退出码 1 结束。不要只看退出码判断失败,应核对消息里的账号,见 连接测试文档。
认证已通过但仓库不存在或无写权限时,查实际仓库地址、账号授权、deploy key 是否只读与组织要求。ls-remote 成功只证明可以读取,不自动证明 push 权限;最后使用原本有权执行的推送流程验证,不要为了测试覆盖正式分支历史。
准备在 VPS 上部署项目时,先让这个账户的代码获取路径稳定,再选择小型 Docker 应用 VPS并安排部署凭据。新服务器不会自动修复本机 SSH 配置或 GitHub 仓库授权,部署用密钥也不必拥有个人账号全部权限。
准备从 Git 部署一个小型应用时,可从 2 GB 内存的 Linux 实例试部署,服务器上还要运行构建和数据库,则按这些峰值一起增加预算。可查看 Evoxt 的项目部署实例,或比较 雨云 RCS 的应用与系统选项。先用最小权限凭据获取代码并完成读写测试,买新 VPS 不会给 GitHub 账号增加仓库权限。




