问题现象:

使用git bash可以正常拉取代码,但每次打开终端都必须执行

# 启动ssh-agent:
eval "$(ssh-agent -s)"

# 将生成的私有键添加到ssh-agent:
ssh-add ~/.ssh/id_rsa_account

否则idea或git bash 都会提示:

 Permission denied(publikey).

Could not read from remote repository

完美解决方法:

手动配置 SSH 识别自定义密钥

需要通过 ~/.ssh/config 文件(若不存在则创建)指定 “主机 - 密钥” 对应关系,告诉 SSH 客户端:“连接某台服务器时,使用哪个自定义密钥”。

步骤如下:
  1. 打开 .ssh 目录路径为:C:\Users\你的用户名\.ssh(例如 C:\Users\hans\.ssh)。

  2. 创建 / 编辑 config 文件

    • 新建一个名为 config 的文本文件(无后缀名,注意不是 config.txt)。

    • 用记事本或编辑器打开,添加以下内容(根据你的实际情况修改):

      config

      # 配置远程仓库的主机(例如公司 Git 服务器或代码仓库地址)
      # 替换为实际的代码仓库域名/自定义别名
      # 若此处使用自定义别名,则必须同步修改远程仓库项目地址(例“git@自定义别名:组织名/test-backend.git”)
      Host codeup.aliyun.com
        # 填写实际代码仓库域名地址
        HostName codeup.aliyun.com
        # Git 仓库通常用 git 作为用户名,其他服务按实际填写
        User git
        # 自定义密钥的完整路径
        IdentityFile C:\Users\用户名\.ssh\id_ed25519_work
      
    • 说明Host 是你连接时使用的主机名(例如 git clone git@git.公司域名.com:xxx/xxx.git 中的 git.公司域名.com),IdentityFile 指向你的自定义私钥路径。

  3. 保存文件 确保文件名为 config(无后缀),保存到 .ssh 目录下。

  4. 测试连接 执行拉取代码的命令(如 git pull),此时 SSH 会自动使用 config 中指定的自定义密钥,无需额外操作。

问题根源:

我原来生成的密钥是指定具体目录的:

ssh-keygen -t ed25519 -C "<注释内容>" -f ~/.ssh/id_ed25519_work_test

而SSH 的默认密钥查找规则是:SSH 客户端(如 gitssh)在连接远程服务器时,会自动在 ~/.ssh 目录下查找以下默认名称的密钥:

  • id_rsaid_rsa.pub(RSA 算法)
  • id_ed25519id_ed25519.pub(Ed25519 算法)
  • id_dsaid_ecdsa 等(其他算法)

如果你的密钥文件名是自定义的(如 id_ed25519_work_test),SSH 客户端不会主动查找,因此无法使用该密钥进行认证,导致拉取代码失败。

问题背景:

由于工作电脑更换,需要重新配置仓库密钥,按照往常生成密钥、配置公钥,然后拉取代码……

what?等等,我试试git bash……

Wait a moment……

于是我各种百度、google、bing、豆包之后,再次进入git bash

成了!!!

但当我满心欢喜使用idea Update Project后……

王德法?!!!于是又一顿百度、google、bing、豆包之后,我人麻了……

然后……重启大法好~

Wait a moment……

然而公鸡嗷嗷嗷~~并无卵用!

要不重装吧?

重装密钥……

重装idea……

重装git……

重装ssh……

无语他妈给无语开门——无语到家了!

不是?为啥啊?算了,抱一下大佬们的大腿吧……

大佬A:没遇到过,我用的token……

大佬B:没遇到过,我用的命令行,我来帮你试试……,拉倒吧,改用命令行吧……

大佬C:没遇到过,我来帮你试试……,你这啥破电脑啊(大佬用的mac,我用的win11),换电脑吧……

总不能重装系统吧?

等等等等,我再捋一捋……

当我重新看到codeup配置ssh指南的生成密钥时:

总不能是这个命令的问题吧?

于是直接执行`ssh-keygen -t ed25519 -C "<注释内容>"`、配置、拉取代码……

不是???成功了?!!!

问题找到了……

问题根源:

我原来生成的密钥是指定具体目录的:

ssh-keygen -t ed25519 -C "<注释内容>" -f ~/.ssh/id_ed25519_work_test

而SSH 的默认密钥查找规则是:SSH 客户端(如 gitssh)在连接远程服务器时,会自动在 ~/.ssh 目录下查找以下默认名称的密钥:

  • id_rsaid_rsa.pub(RSA 算法)
  • id_ed25519id_ed25519.pub(Ed25519 算法)
  • id_dsaid_ecdsa 等(其他算法)

如果你的密钥文件名是自定义的(如 id_ed25519_work_test),SSH 客户端不会主动查找,因此无法使用该密钥进行认证,导致拉取代码失败。

完美解决方法:

手动配置 SSH 识别自定义密钥

需要通过 ~/.ssh/config 文件(若不存在则创建)指定 “主机 - 密钥” 对应关系,告诉 SSH 客户端:“连接某台服务器时,使用哪个自定义密钥”。

步骤如下:
  1. 打开 .ssh 目录路径为:C:\Users\你的用户名\.ssh(例如 C:\Users\hans\.ssh)。

  2. 创建 / 编辑 config 文件

    • 新建一个名为 config 的文本文件(无后缀名,注意不是 config.txt)。

    • 用记事本或编辑器打开,添加以下内容(根据你的实际情况修改):

      config

      # 配置远程仓库的主机(例如公司 Git 服务器或代码仓库地址)
      # 替换为实际的代码仓库域名/自定义别名
      # 若此处使用自定义别名,则必须同步修改远程仓库项目地址(例“git@自定义别名:组织名/test-backend.git”)
      Host codeup.aliyun.com
        # 填写实际代码仓库域名地址
        HostName codeup.aliyun.com
        # Git 仓库通常用 git 作为用户名,其他服务按实际填写
        User git
        # 自定义密钥的完整路径
        IdentityFile C:\Users\用户名\.ssh\id_ed25519_work
      
    • 说明Host 是你连接时使用的主机名(例如 git clone git@git.公司域名.com:xxx/xxx.git 中的 git.公司域名.com),IdentityFile 指向你的自定义私钥路径。

  3. 保存文件 确保文件名为 config(无后缀),保存到 .ssh 目录下。

  4. 测试连接 执行拉取代码的命令(如 git pull),此时 SSH 会自动使用 config 中指定的自定义密钥,无需额外操作。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐