【MAC】解决 GitHub `git push` 无法通过 HTTPS 推送的问题 —— 使用 SSH 方式
在使用 Git 进行版本控制和代码托管时,git push
操作是常见的任务。然而,有时您可能会遇到无法通过 HTTPS 推送代码到 GitHub 的问题。本文将详细介绍如何通过配置 SSH 连接,解决 git push
无法通过 HTTPS 推送的问题。
目录
问题描述
在尝试使用 git push
命令将本地代码推送到 GitHub 仓库时,遇到以下错误:
fatal: unable to access 'https://github.com/SIGN369/apocalypse.git/': Failed to connect to github.com port 443 after 75001 ms: Couldn't connect to server
尽管您可以正常访问 GitHub 网站,但 git push
操作仍然失败。这表明 HTTPS 方式的 Git 操作存在连接问题。
问题分析
出现上述错误可能有多种原因:
- 网络连接问题:本地网络无法稳定连接到 GitHub 的 443 端口。
- 防火墙或安全软件阻止:本地防火墙或公司网络策略可能阻止了对 GitHub 的 HTTPS 访问。
- Git 配置问题:Git 可能配置了错误的代理或存在其他配置问题。
- DNS 解析问题:DNS 无法正确解析
github.com
域名。 - SSL 证书验证失败:系统时间不正确或证书过期导致 SSL 验证失败。
由于 HTTPS 方式可能受到上述因素的影响,切换到 SSH 方式通常可以有效绕过这些问题。
解决方案概述
本文将指导您通过以下步骤,使用现有的 Ed25519 SSH 密钥 配置 Git 与 GitHub 的 SSH 连接,从而解决 git push
无法通过 HTTPS 推送的问题:
- 检查现有的 SSH 密钥。
- 启动 SSH Agent 并添加现有的 Ed25519 私钥。
- 将 Ed25519 公钥添加到 GitHub 账户。
- 验证 SSH 连接。
- 将 Git 远程仓库地址修改为 SSH 格式。
- 尝试推送代码。
详细步骤
步骤一:检查现有的 SSH 密钥
首先,确认系统中是否已经存在 SSH 密钥对,特别是 Ed25519 类型的密钥。
-
打开终端。
-
列出
.ssh
目录中的文件:ls -al ~/.ssh
示例输出:
total 32 drwxr-xr-x@ 6 sign staff 192 Nov 15 14:57 . drwxr-x---+ 84 sign staff 2688 Nov 30 02:59 .. -rw-------@ 1 sign staff 464 Aug 8 15:33 id_ed25519 -rw-r--r--@ 1 sign staff 103 Aug 8 15:33 id_ed25519.pub -rw-------@ 1 sign staff 1953 Nov 15 14:57 known_hosts -rw-------@ 1 sign staff 1195 Nov 15 14:56 known_hosts.old
从输出中看已经有
id_ed25519
(私钥)和id_ed25519.pub
(公钥)文件。已经有一个 Ed25519 类型的 SSH 密钥对,无需生成新的 RSA 密钥对。
步骤二:启动 SSH Agent 并添加现有的 Ed25519 私钥
-
启动 SSH Agent:
eval "$(ssh-agent -s)"
示例输出:
Agent pid 59566
-
添加 Ed25519 私钥到 SSH Agent:
ssh-add ~/.ssh/id_ed25519
如果在生成密钥时设置了密码短语,系统会提示您输入。
注意:确保使用的是正确的私钥文件路径和名称。如果密钥文件有自定义名称,请相应修改命令。
步骤三:将 Ed25519 公钥添加到 GitHub 账户
-
复制公钥内容:
使用以下命令将公钥内容复制到剪贴板:
pbcopy < ~/.ssh/id_ed25519.pub
说明:
pbcopy
是 macOS 上的命令,用于将输入内容复制到剪贴板。如果您没有pbcopy
,可以手动复制:cat ~/.ssh/id_ed25519.pub
然后手动复制输出的内容。
-
登录 GitHub 账户:
-
导航到 SSH 密钥设置:
- 点击右上角的 头像,选择 Settings(设置)。
- 在左侧菜单中,点击 SSH and GPG keys。
-
添加新的 SSH 密钥:
- 点击 New SSH key 按钮。
- 标题(Title):为您的密钥命名,例如
My MacBook Pro
。 - 密钥(Key):在此处粘贴您刚刚复制的公钥内容。
- 点击 Add SSH key。
步骤四:验证 SSH 连接
在终端中运行以下命令,测试与 GitHub 的 SSH 连接:
ssh -T git@github.com
输出:
Hi SIGN369! You've successfully authenticated, but GitHub does not provide shell access.
- 成功连接:表示 SSH 连接已正确配置。
- 首次连接警告:如果这是您第一次通过 SSH 连接 GitHub,系统可能会提示您确认主机。输入
yes
以继续。
常见问题:
-
Permission denied (publickey).
解决方法:
- 确认公钥已正确添加到 GitHub。
- 确保私钥已添加到 SSH Agent。
- 检查公钥文件是否完整无误。
步骤五:将 Git 远程仓库地址修改为 SSH 格式
当前,您的 Git 远程仓库可能使用的是 HTTPS 地址。为了使用 SSH 进行推送,您需要将远程地址修改为 SSH 格式。
-
查看当前远程仓库地址:
git remote -v
示例输出:
origin https://github.com/SIGN369/apocalypse.git (fetch) origin https://github.com/SIGN369/apocalypse.git (push)
-
将远程地址修改为 SSH 格式:
git remote set-url origin git@github.com:SIGN369/apocalypse.git
-
验证远程地址是否修改成功:
git remote -v
示例输出:
origin git@github.com:SIGN369/apocalypse.git (fetch) origin git@github.com:SIGN369/apocalypse.git (push)
步骤六:尝试推送代码
现在,您可以尝试使用 SSH 方式推送代码。
-
推送到主分支(
main
或master
):根据您的分支名称,运行以下命令:
git push origin main
或者
git push origin master
-
成功推送:
成功示例输出:
Counting objects: 5, done. Delta compression using up to 8 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 300 bytes | 300.00 KiB/s, done. Total 3 (delta 1), reused 0 (delta 0) To git@github.com:SIGN369/apocalypse.git abcdef1..1234567 main -> main
这表示代码已成功推送到 GitHub 仓库。
补充说明
1. 多个 SSH 密钥的配置
如果在同一台机器上使用多个 SSH 密钥(例如用于不同的 GitHub 账户),需要配置 SSH config
文件来指定每个仓库使用的密钥。
编辑或创建 ~/.ssh/config
文件:
nano ~/.ssh/config
添加以下内容:
# GitHub account 1
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519
保存并退出(在 nano
中,按 Ctrl + O
保存,Ctrl + X
退出)。
2. 权限设置
确保您的 .ssh
目录和密钥文件具有正确的权限,以确保 SSH 安全性。
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
常见问题及解决方法
1. ssh-add
报错:Could not open a connection to your authentication agent.
解决方法:
确保 SSH Agent 已启动:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
2. Permission denied (publickey).
可能原因:
- 公钥未正确添加到 GitHub。
- 使用了错误的 SSH 密钥。
- SSH Agent 未添加私钥。
解决方法:
-
确认公钥已添加到 GitHub。
-
确保使用正确的私钥。
-
检查 SSH Agent 是否已添加私钥:
ssh-add -l
如果没有列出您的密钥,添加它:
ssh-add ~/.ssh/id_ed25519
3. GitHub 不识别您的 SSH 密钥
解决方法:
- 确保公钥完整无误地添加到 GitHub。
- 检查是否有多余的空格或换行。
- 重新生成并添加新的 SSH 密钥。
end
通过以上步骤,成功配置 SSH 连接,从而解决 git push
无法通过 HTTPS 推送代码到 GitHub 的问题。使用 SSH 不仅可以绕过 HTTPS 连接中的网络问题,还能提高操作的安全性。
关键步骤回顾:
- 检查并使用现有的 SSH 密钥(Ed25519)。
- 启动 SSH Agent 并添加私钥。
- 将公钥添加到 GitHub 账户。
- 验证 SSH 连接。
- 将 Git 远程仓库地址修改为 SSH 格式。
- 尝试推送代码。