Skip to content

Github创建提交密钥最容易踩的坑

youxiaohanpian
Published date:
git fetch --all
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
error: could not fetch upstream
error: RPC failed; curl 28 Recv failure: Connection was reset
fatal: expected flush after ref listing
error: could not fetch origin

这个错误信息表明在使用 Git 从远程仓库获取代码时出现了问题,下面为你详细解释并给出解决办法。

错误原因剖析

  1. 权限问题(公钥错误)
[email protected]: Permission denied (publickey).
fatal: Could not read from remote repository.

这个错误是因为 GitHub 没办法通过 SSH 密钥验证你的身份。一般是由以下情况导致的:

  1. 网络连接问题
error: RPC failed; curl 28 Recv failure: Connection was reset
fatal: expected flush after ref listing

这个错误是在数据传输时网络连接中断造成的。可能的因素有:

解决办法

1. 解决 SSH 权限问题

首先,确认 SSH 密钥是否存在并且配置正确:

# 查看是否已有 SSH 密钥
ls -al ~/.ssh/id_rsa.pub  # 若没有该文件,需生成新的 SSH 密钥

# 生成新的 SSH 密钥(如果需要)
ssh-keygen -t rsa -b 4096 -C "[email protected]"
# 按提示操作,无需修改默认值

# 启动 SSH 代理并添加私钥
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa

# 复制公钥到剪贴板
cat ~/.ssh/id_rsa.pub | pbcopy  # macOS
xclip -sel clip < ~/.ssh/id_rsa.pub  # Linux

接着,把公钥添加到 GitHub 账户:

ssh -T [email protected]
# 成功的话会看到:Hi username! You've successfully authenticated...

2. 解决网络连接问题

可以尝试以下几种方法:

# 增加 Git 的 HTTP 缓冲区大小
git config --global http.postBuffer 524288000  # 500MB

# 修改远程仓库的 URL,从 SSH 改为 HTTPS
git remote set-url origin <https://github.com/your-username/your-repo.git>

# 或者,如果你想用 SSH,先克隆 HTTPS 版本,之后再切换回 SSH
git clone <https://github.com/your-username/your-repo.git>
cd your-repo
git remote set-url origin [email protected]:your-username/your-repo.git

# 若网络不稳定,可以分多次获取
git fetch --depth=1 origin main  # 只获取最近的提交

总结处理步骤

  1. 生成 SSH 密钥并添加到 GitHub。
  2. 检查并更新远程仓库的 URL。
  3. 增大 HTTP 缓冲区,避免传输中断。
  4. 尝试使用 HTTPS 替代 SSH 进行克隆和获取操作。

错误原因分析

在运行 ssh-keygen 命令时,系统会提示你输入几个信息:

  1. 密钥保存位置
Enter file in which to save the key (C:\\Users\\somebody/.ssh/id_rsa):

你在这里输入了 eval "$(ssh-agent -s)" ,这是错误的。这个提示需要的是一个 文件路径 ,而不是命令。

  1. 密码短语(Passphrase) 接下来系统要求你设置一个密码短语来保护私钥,但你两次输入的密码不一致:
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Passphrases do not match.  Try again.
  1. 最终错误
Saving key "eval "$(ssh-agent -s)"" failed: No such file or directory

由于你输入的是一个无效的文件路径,系统无法创建名为 eval "$(ssh-agent -s)" 的文件,因此报错。

正确生成SSH密钥的步骤

1. 重新运行密钥生成命令

ssh-keygen -t rsa -b 4096 -C "[email protected]"

2. 正确回答提示问题

Generating public/private rsa key pair.
Enter file in which to save the key (C:\\Users\\somebody/.ssh/id_rsa):  # 直接回车
Enter passphrase (empty for no passphrase):  # 输入密码(密码不会显示)
Enter same passphrase again:  # 再次输入相同密码
Your identification has been saved in C:\\Users\\somebody/.ssh/id_rsa.
Your public key has been saved in C:\\Users\\somebody/.ssh/id_rsa.pub.

3. 启动SSH代理并添加私钥

# Windows上使用Git Bash的正确命令
eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa

总结

1. 使用 Git Bash(推荐)

如果你使用的是 Git Bash (安装 Git 时附带的终端),可以使用以下命令:

cat ~/.ssh/id_rsa.pub | clip  # 将公钥复制到剪贴板

2. 使用 PowerShell

如果你使用的是 PowerShell ,可以使用以下命令:

Get-Content ~/.ssh/id_rsa.pub | Set-Clipboard  # PowerShell 5.1+

或者使用更通用的方法:

type $env:USERPROFILE\\.ssh\\id_rsa.pub | clip  # 适用于所有 PowerShell 版本

3. 使用 Windows 命令提示符(CMD)

如果你使用的是 命令提示符(CMD) ,可以使用以下命令:

type %USERPROFILE%\\.ssh\\id_rsa.pub | clip  # 将公钥复制到剪贴板

4. 手动复制

如果你不想使用命令,也可以手动打开并复制:

# 用记事本打开公钥文件
notepad ~/.ssh/id_rsa.pub

然后在记事本中手动选中所有内容(Ctrl+A)并复制(Ctrl+C)。 文件位置:C:\Users\Administrator/.ssh/id_rsa.pub

验证是否复制成功

复制后,可以打开一个文本编辑器(如记事本),按 Ctrl+V 粘贴,如果能看到类似下面的内容,说明复制成功:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC... 你的邮箱@example.com

接下来,你可以将这段内容粘贴到 GitHub 的 SSH 密钥设置页面中。

在 GitHub 中添加 SSH 密钥时, TitleKey Type 是两个不同的设置,它们的作用和填写方式如下:

1. Title(标题)

2. Key Type(密钥类型)

总结

Column 1Column 2Column 3Column 4
设置项是否必填填写建议用途示例
Title填写设备或用途名称(如 MacBook Pro区分不同设备的密钥
Key Type默认为 Authentication Key认证密钥用于登录,签名密钥用于代码签名

操作步骤示例

  1. 复制 SSH 公钥 (参考之前的回复):
cat ~/.ssh/id_rsa.pub | clip  # Git Bash
  1. 在 GitHub 添加密钥
    • 进入 GitHub Settings > SSH and GPG keys
    • 点击 New SSH key
    • Title :输入 My Development Machine
    • Key Type :选择 Authentication Key
    • Key :粘贴你复制的公钥内容(以 ssh-rsa 开头)
    • 点击 Add SSH key

完成后,如果报以下错误,

> git fetch --all
From github.com:youxiaohanpian/astro-notion-blog-main
   b52b41f..e8c9be6  main       -> upstream/main
fatal: unable to access 'https://github.com/youxiaohanpian/astro-notion-blog-main.git/': Failed to connect to github.com port 443 after 21075 ms: Couldn't connect to server
error: could not fetch origin

查询下状态

PS E:\astro-notion-blog-main> git remote -v
origin  https://github.com/youxiaohanpian/astro-notion-blog-main.git (fetch)
origin  https://github.com/youxiaohanpian/astro-notion-blog-main.git (push)
upstream        git@github.com:youxiaohanpian/astro-notion-blog-main.git (fetch)
upstream        git@github.com:youxiaohanpian/astro-notion-blog-main.git (push)

仓库配置显示, origin 使用的是 HTTPS 协议,而 upstream 使用的是 SSH 协议。 切换到 SSH 协议 就是将 origin 的 URL 从 HTTPS 改为 SSH,这样你就可以通过 SSH 密钥验证访问 GitHub,避免 HTTPS 连接可能遇到的网络问题。

为什么需要切换?

如何切换?

根据你的输出,你已经成功配置了 upstream 的 SSH 连接( [email protected]:... ),说明你的 SSH 密钥设置正确。只需将 origin 也切换到 SSH 协议即可:

# 将origin的URL从HTTPS切换到SSH
git remote set-url origin [email protected]:youxiaohanpian/astro-notion-blog-main.git

# 验证配置是否更新
git remote -v

预期输出

origin  [email protected]:youxiaohanpian/astro-notion-blog-main.git (fetch)
origin  [email protected]:youxiaohanpian/astro-notion-blog-main.git (push)
upstream        [email protected]:youxiaohanpian/astro-notion-blog-main.git (fetch)
upstream        [email protected]:youxiaohanpian/astro-notion-blog-main.git (push)

验证 SSH 连接

在切换后,测试 SSH 连接是否正常:

ssh -T [email protected]

如果看到类似以下信息,说明 SSH 连接成功:

Hi youxiaohanpian! You've successfully authenticated...

后续操作

切换后,再次尝试拉取代码:

git fetch --all

如果仍然遇到问题,可能是网络环境限制了 SSH 端口(22)。这种情况下,你可以尝试使用 SSH 代理跳转HTTPS 带凭证方式 (需输入 GitHub 用户名和 PAT 令牌)。

总结

  1. 切换协议 :将 origin 从 HTTPS 改为 SSH 解决连接问题。
  2. 利用现有配置 :你已经正确配置了 upstream 的 SSH,说明密钥可用。
  3. 测试连接 :通过 ssh -T [email protected] 验证 SSH 连通性。

SSH 密钥的缓存时间和使用方式取决于你的操作系统和配置。以下是不同环境下的详细说明:

1. 缓存有效期

Windows Git Bash

# 启动时自动加载密钥(添加到 ~/.bashrc 或 ~/.bash_profile)
if [ -z "$SSH_AUTH_SOCK" ]; then
   eval $(ssh-agent -s)
   ssh-add /c/Users/somebody/.ssh/id_rsa
fi

macOS

# 添加密钥并存储到 Keychain
ssh-add -K /c/Users/somebody/.ssh/id_rsa
Host *
  UseKeychain yes
  AddKeysToAgent yes
  IdentityFile ~/.ssh/id_rsa

Linux

eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa

2. 是否每次打开 Git Bash 都要执行?

3. 推荐配置方案

Windows Git Bash 用户

  1. 编辑 ~/.bashrc 文件 (在 Git Bash 中执行):
nano ~/.bashrc
  1. 添加以下内容
# 启动 SSH Agent 并自动加载密钥
if [ -z "$SSH_AUTH_SOCK" ]; then
  eval $(ssh-agent -s)
  ssh-add /c/Users/somebody/.ssh/id_rsa
fi
  1. 保存并退出 (按 Ctrl+X ,然后按 Y ,最后按 Enter )。
  2. 重新启动 Git Bash ,密钥将自动加载。

4. 验证配置

# 查看已加载的密钥
ssh-add -l

# 如果看到你的密钥,则表示已成功加载
2048 SHA256:xxx... /c/Users/somebody/.ssh/id_rsa (RSA)

总结

本地仓库换远程仓库的方法

cd D:\clipdrop-api-samples
git remote remove origin
git remote add origin https://github.com/youxiaohanpian/clipdrop-api-samples.git
git push -u origin main
  1. cd D:\\clipdrop-api-samples

    • 切换到本地电脑中 D:\\clipdrop-api-samples 这个文件夹(即你存放ClipDrop API示例代码的目录)。
    • 只有先进入这个文件夹,后续的Git命令才能对该仓库生效。
  2. git remote remove origin

    • 移除当前本地仓库关联的名为“origin”的远程仓库地址。
    • “origin”是Git默认给远程仓库起的别名,通常指向代码的原始来源(比如你从GitHub克隆的仓库)。这一步是为了“解绑”原来的远程仓库。
  3. git remote add origin <https://github.com/youxiaohanpian/clipdrop-api-samples.git >

    • 给本地仓库添加一个新的远程仓库关联,别名依然叫“origin”,地址是 https://github.com/youxiaohanpian/clipdrop-api-samples.git (这应该是你自己的GitHub仓库地址)。
    • 之后用“origin”这个别名,就能指代这个新的远程仓库了。
  4. git push -u origin main

    • 把本地仓库的代码推送到远程仓库的“main”分支。
    • u 是“关联”的意思,后续再推代码时,直接用 git push 就能默认推到这个远程仓库的main分支,不用重复写地址和分支名。

简单说 :这几步操作的目的是——把你本地的 clipdrop-api-samples 代码文件夹,从原来关联的远程仓库“解绑”,重新关联到你自己的GitHub仓库,然后把本地代码上传到新仓库里。

💡 > 欢迎分享文章,或是 来信 与我交流

Previous
我用 ai 工具给民政局做了一个婚姻宣传动画
Next
Notion 转个人网站和博客最简单的免费方案