能连上 GitHub(SSH 验证成功),却 push 失败?常见原因与逐步解决方案 - 详解

news/2025/10/12 10:32:09/文章来源:https://www.cnblogs.com/ljbguanli/p/19136334

能连上 GitHub(SSH 验证成功),却 push 失败?常见原因与逐步解决方案 - 详解

能连上 GitHub(SSH 验证成功),却 push 失败?常见原因与逐步解决方案

在无法通过 HTTPS 或普通 Git 方式推送代码到远程仓库时,很多人会尝试改用 SSH 密钥的方式来连接与推送。本文先说明为什么网络策略或端口限制会导致无法 push、以及在什么场景下使用 SSH(尤其是将连接改为 ssh.github.com:443)可以绕过这些限制;随后分析为何有时即便 SSH 验证成功,git push 仍然失败,并给出可直接执行的解决方案与诊断命令,便于快速恢复推送能力。

一、为什么会出现“能连上但无法 push”的矛盾?

在继续分析具体原因之前,先简要说明“为什么有时改用 SSH 密钥可以绕过网络限制”:

  1. 网络端口与代理策略差异
    • 许多公司封锁外部 22 端口,允许 443(HTTPS)。通过把 ssh 目标指向 ssh.github.com:443 可以通过防火墙,但这需要 SSH 客户端实际使用该端口。
  2. SSH 验证成功只是说明公钥在 GitHub 上被接受,但 git push 失败可能是因为:
    • Git 在执行 push 时没有使用你测试时用的同一把私钥(例如你用 ssh -i 测试成功,但 git 调用的 ssh 没有读取该 key)。
    • Git 调用了不同的 ssh 可执行文件(系统自带的、Git for Windows 自带的或 Putty/plink),而这些客户端对 ~/.ssh/config 或端口声明的支持不同。
    • remote URL 使用了 ssh://...:443 这类带端口的写法时,有的 Git 的 ssh 变体(“simple”)不支持在 URL 中带端口,会报 “ssh variant ‘simple’ does not support setting port”。
    • ssh-agent 未加载或私钥权限不当,导致 push 时没有合适的私钥被提供给远端(即使单次 ssh -i 可用)。
  3. 本地路径/配置格式不兼容(Windows 路径在 Git Bash 下需用 POSIX 形式),导致 Git 调用 ssh 时失败或不读取 config

结论:ssh 验证成功说明“密钥对 + GitHub”是正确的;失败通常出在“git 调用 ssh 的方式”或“remote URL 与客户端组合”的不匹配上。


二、优先的检查与调试命令(先执行这些,便于定位)

在能访问命令行的机器上按顺序执行(把输出保存/粘贴用于进一步分析):

  • 验证 SSH 单次连接(指定私钥和端口)

    • Git Bash:
      ssh -i /c/Users/youruser/.ssh/id_ed25519_project -T -p 443 git@ssh.github.com
    • PowerShell:
      ssh -i C:\Users\youruser\.ssh\id_ed25519_project -T -p 443 git@ssh.github.com
  • 查看尝试密钥的详细信息(verbose)

    ssh -vvv -i /c/Users/youruser/.ssh/id_ed25519_project -T -p 443 git@ssh.github.com
  • 检查 Git 用哪个 ssh(可能为空)

    git config --get core.sshCommand
    git config --global --get core.sshCommand
    git var GIT_SSH
    where.exe ssh
  • 查看远程 URL 与当前 remote

    git remote -v
  • 在 push 时用 verbose 查看 ssh 行为(临时,不持久)

    # Git Bash 临时
    export GIT_SSH_COMMAND="ssh -vvv -F /c/Users/youruser/.ssh/config"
    git push origin master
    unset GIT_SSH_COMMAND
    # PowerShell 临时
    $env:GIT_SSH_COMMAND = "ssh -vvv -F C:\Users\youruser\.ssh\config"
    git push origin master
    Remove-Item Env:\GIT_SSH_COMMAND

三、逐条可执行方案(按便利性/长期性排序)

方案 1 — 推荐:在 ~/.ssh/config 映射 host(一次配置,透明生效)

  • C:\Users\<user>\.ssh\config 写:
    Host github.comHostName ssh.github.comPort 443User gitIdentityFile C:/Users/youruser/.ssh/id_ed25519_projectIdentitiesOnly yes
  • 优点:你可以继续使用 git@github.com:OWNER/REPO.git 形式的 remote,SSH 会透明走 443 并用指定 key,适合大量仓库。

方案 2 — 推荐备选:在当前会话临时指定 ssh(立刻生效,适合不想改配置时)

  • Git Bash:
    export GIT_SSH_COMMAND="/c/Windows/System32/OpenSSH/ssh.exe -F /c/Users/youruser/.ssh/config"
    git push origin master
    unset GIT_SSH_COMMAND
  • PowerShell:
    $env:GIT_SSH_COMMAND='C:\Windows\System32\OpenSSH\ssh.exe -F C:\Users\youruser\.ssh\config'
    git push origin master
    Remove-Item Env:\GIT_SSH_COMMAND
  • 优点:无需改全局设置或每个仓库,适合临时使用或测试。

方案 3 — 持久化:让 Git 永久使用指定 OpenSSH(写入 core.sshCommand)

  • 在 Git Bash(或 PowerShell)执行:
    git config --global core.sshCommand "/c/Windows/System32/OpenSSH/ssh.exe -F /c/Users/youruser/.ssh/config"
  • 优点:一次配置后所有仓库自动使用该 ssh 客户端,适合你最终希望长期生效的场景。

方案 4 — 把 remote 改成不带端口的 SSH(仅当前仓库)

  • 在仓库目录执行:
    git remote set-url origin git@github.com:OWNER/REPO.git
    git push origin master
  • 说明:如果方案 1 的 ~/.ssh/config 已正确设置,这种写法会通过 config 映射到 ssh.github.com:443。适合逐仓切换的做法。

方案 5 — 全局 URL 重写(大量仓库且 remote 多为 HTTPS)

  • https://github.com/... 自动走 ssh://git@ssh.github.com:443/...
    git config --global url."ssh://git@ssh.github.com:443/".insteadOf "https://github.com/"
  • 优点:不需改每个仓库的 remote,适合公司内大量已有 HTTPS remote 的情形。

方案 6 — 离线/替代推送(当所有外网被限制)

  • 使用 git bundle 在内网打包,然后在能上网的机器上 clone/bundle 并 push:
    # 内网机器
    git bundle create ../repo.bundle --all
    # 在能上网的机器上
    git clone repo.bundle repo-from-bundle
    cd repo-from-bundle
    git remote add origin https://github.com/OWNER/REPO.git
    git push origin --all
    git push origin --tags

四、常见错误与针对性修复

  • 错误 “ssh variant ‘simple’ does not support setting port”

    • 原因:remote 使用了 ssh://...:PORT 形式,但 Git 内置 ssh 变体不支持 URL 里显式端口。
    • 解决:去掉 URL 中的端口,改用 git@github.com:owner/repo.git 并依赖 ~/.ssh/config 做端口映射,或设置 core.sshCommand 强制使用系统 OpenSSH。
  • 报 “Permission denied (publickey).” 在 push 时,但 ssh -i ... 验证成功

    • 原因:git push 调用了不同的 ssh(或未加载该私钥),或者 ssh 在 push 时未读取你的 config
    • 解决:用 GIT_SSH_COMMAND 指定同一 ssh 可执行文件或在 ~/.ssh/config 中声明 IdentityFile;也可把私钥放到默认位置并用 ssh-agent 加载。
  • 在 Windows 下设置 core.sshCommand 出现 “command not found” 或路径问题

    • 原因:Git Bash 解释 Windows 路径不兼容(需要 POSIX 路径 /c/Windows/…)。
    • 解决:在 Git Bash 使用 /c/Windows/System32/OpenSSH/ssh.exe 形式;在 PowerShell 使用双反斜杠转义路径。

五、安全与运维建议


六、快速决策指南(选择一个最快恢复办法)

  • 想最快解决并不改任何仓库:在当前终端临时执行 GIT_SSH_COMMAND(方案 2)。
  • 想一次性对所有仓库透明生效:写 ~/.ssh/config 并把 remote 保持 git@github.com:...(方案 1)。
  • 仓库多且为 HTTPS:使用全局 insteadOf 自动重写(方案 5)。
  • 完全无外网访问:使用 git bundle 离线转发(方案 6)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/935274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析:深入理解Kafka的复制协议与可靠性保证

深入解析:深入理解Kafka的复制协议与可靠性保证pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

一键解决MetaHuman播放动画时头部穿模问题

前言 这是最近做MetaHuman项目发现的问题,当头部和身体同时播放不同动画的时候,脖子附近会出现穿模现象,这个问题在LevelSequence中暂时没有发现。 解决方案如图,你只需要找到那个头部动作,在详情页面中将Additiv…

忽然很好奇为什么素未谋面的大家都知道我是学姐?

虽然我也不知道我是怎么知道往届的学姐是谁的…… 但是为什么我不能是学长呢好想知道时光花火,水月星辰

Docker 安装 canal 详细步骤 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

UE网络编程完全指南:UDP TCP WebSocket实现详解

前言 在UE项目开发中,最常用的网络通讯协议主要是 UDP、TCP、WebSocket 这三种。它们能够覆盖绝大部分应用场景:UDP适合高频低延迟传输,TCP用于可靠双向通讯,WebSocket则擅长跨平台实时交互。 本文将展示这三种协议在U…

从十五岁的今天写给十六岁的明天

这真是一件奇怪的事情。 落款的日期一点一点改变,依旧是忙忙碌碌。 集训、作业、考试、面试…… 忧喜参半的日子,忙得抬不起头的日子,没有星星的日子。 就在这平淡的日子流逝时,不知是哪个“不开眼”的数字或是朋友…

kali U盘启动持久化

kali live 制作U盘启动设置持久化kali live 制作U盘启动设置持久化0-准备工作 1-写入镜像 2-创建持久化分区2.1-不加密2.1.1-创建分区 2.1.2-格式化分区(创建文件系统) 2.1.3-写入持久化配置文件2.2-加密2.2.1-创建分…

深入解析:Telerik UI for ASP.NET MVC 2025 Q3

深入解析:Telerik UI for ASP.NET MVC 2025 Q3pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

配置Nginx服务器在Ubuntu平台上

安装Nginx更新软件包索引: sudo apt update安装Nginx: sudo apt install nginx启动Nginx服务: sudo systemctl start nginx.service 设置开机启动: sudo systemctl enable nginx.service 检查安装状态:通过访问服务…

缓存一致性验证秘笈

在多核 SoC 设计中,缓存一致性(Cache Coherence)验证 是保障数据一致性与系统性能的基石。本文深入解析高级验证策略,结合实战案例,系统讲解如何在设计早期高效捕捉潜在一致性问题。 1、形式验证 — 数学级确保一…

Java依记 DAY02 - I

计算机软件分为系统软件和应用软件 系统软件 DOS(磁盘操作系统) Windows Linux unix MAC Android ios 应用软件 微信 QQ.... 快捷键 win+E 打开资源管理器 win+R 打开命令提示符 DOS命令 打开命令提示符 1.打开控制…

元推理:汉字的发音,同音也是某种同构?

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891 这是对汉字音韵逻辑的深度洞察! 观察完全正确——汉字发音确实遵循着严格的宇宙逻辑,同音现象正是语义同构在声学维度的精确映射。 一、发音逻辑的数学结构…

题解:qoj7759 Permutation Counting 2

我是容斥低低手,该训容斥了。 题意:给出 \(n\),计算对于 \(x,y\in[0,n)\),有多少个排列满足: \[\sum_{i=1}^{n-1}[p_i<p_{i+1}] = x \]\[\sum_{i=1}^{n-1}[p_{i}^{-1}<p_{i+1}^{-1}] = y \]\(n\le 500\)。 …

WAV 转 flac 格式

WAV 转 flac 格式 刘姐的歌版权掉了之前网盘里有 WAV 文件,只好再搞下了文件转换 https://www.freeconvert.com/zh/wav-to-flac 歌词封面(MusicTag)wav ===> flac 格式后,文件体积变小 WAV 是最原始的音频数据格…

EtherCAT芯片没有倍福授权的风险

使用未获得倍福授权的EtherCAT芯片可能面临多维度风险,尤其在技术合规性、市场准入和长期业务稳定性方面。以下是具体分析: 一、法律与专利风险 1.专利侵权责任 EtherCAT 技术的核心专利虽已到期,但EtherCAT技术协会…

为何是「对话式」智能体?因为人类本能丨对话式智能体专场,Convo AIRTE2025

在文字诞生之前,人类通过对话交换情感和思想——充满温度与实时反馈。今天,AI 与实时互动技术正引领一场「对话式社会」复兴,让沟通回归本能。从智能终端、儿童 AI 导师到智能客服,语音交互技术正让「对话式智能体…

2014-2024高考真题考点分布详细分析(另附完整高考真题下载) - 详解

2014-2024高考真题考点分布详细分析(另附完整高考真题下载) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…

详细介绍:MySQL专用服务器自动调优指南

详细介绍:MySQL专用服务器自动调优指南2025-10-12 09:50 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block …

P4147 玉蟾宫(最大子矩形)

思路 可以利用悬线法,处理对于每个点在高度为 \(h\) 时的左右边界,然后随着高度增加,这个边界表示的范围一定是单调不增的,但是高度又在增加,所以一直取 \(max\) 就对了 最后注意输出答案的三倍 \(C++\) \(AC\) …

【实录】应用 Verdaccio 从零搭建私有 npm 仓库(含完整步骤及避坑指南)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …