返回

解决Windows VS Code无法推送代码到GitHub问题

windows

Windows, VS Code, GitHub, 公钥那些事儿:解决无法推送代码的问题

最近碰上个挺头疼的问题:在 Windows 上用 VS Code 连 GitHub,明明仓库是自己的,公钥也配了,死活就是推不上去代码。 网上搜了一堆资料,感觉都差点意思,今天就来彻底捋一捋这事儿。

一、 问题现象:VS Code 能克隆,但不能推送

简单说,情况是这样的:

  1. Windows 10 或 11 系统。
  2. 用 VS Code。
  3. 在用 GitHub 上已有的、自己创建的私有仓库(就是能直接推拉代码,不用发 Pull Request 的那种)。
  4. 想用公钥/私钥的方式连接 GitHub。
  5. VS Code 里面显示已连接 GitHub 账户。
  6. 可以从github 克隆项目.
  7. 可以正常 commit。
  8. 无法push到 github,提示没有权限。

二、 问题原因:VS Code 没用上 SSH 密钥

虽然 VS Code 上显示连上了 GitHub,但它可能并没用你配置好的 SSH 密钥去进行身份验证。 默认情况下, 可能在使用https 协议连接仓库,而你期望通过 ssh 连接,导致鉴权出问题。也有可能是ssh key 设置的有问题.

三、 解决方案:让 VS Code 用上 SSH 密钥!

下面给出几种解决方案, 总有一种适合你!

1. 确保使用 SSH URL 克隆仓库

这是最容易被忽略的一点。 你需要确保用 SSH 方式克隆的仓库,而不是 HTTPS。

  • 原理:

    • HTTPS 方式需要用户名和密码(或者 Personal Access Token),每次操作都得输,比较麻烦。
    • SSH 方式通过密钥对验证身份,不用输密码,更安全方便。
  • 操作步骤:

    1. 在 GitHub 上打开你的仓库,点击绿色的 "Code" 按钮。
    2. 选择 "SSH",复制仓库的 SSH URL(长得像 git@github.com:你的用户名/你的仓库名.git)。
    3. 在 VS Code 中,使用 Ctrl+Shift+P (Windows) 或 Cmd+Shift+P (Mac) 打开命令面板。
    4. 输入 Git: Clone,选择 "Git: Clone"。
    5. 粘贴刚刚复制的 SSH URL,回车。
    6. 选择一个本地目录来存放克隆的仓库。
  • 代码示例

git clone git@github.com:你的用户名/你的仓库名.git

  • 检查
    重新 clone 后, 再次进行 commit and push 操作.看问题是否解决.

2. 检查 SSH 密钥是否正确配置

如果你确定是用 SSH URL 克隆的,那就要检查 SSH 密钥是否正确配置了。

  • 原理:
    SSH 密钥由一对文件组成:私钥(通常叫 id_rsa,别告诉别人!)和公钥(通常叫 id_rsa.pub,可以公开)。GitHub 上需要配置你的公钥,本地需要有对应的私钥。

  • 操作步骤:

    1. 生成 SSH 密钥(如果还没有):

      • 打开 Git Bash(Windows)或者终端(Mac/Linux)。
      • 输入 ssh-keygen -t ed25519 -C "你的邮箱地址",一路回车,使用默认设置就行。
      • 会在 ~/.ssh/ 目录下生成 id_ed25519 (私钥) 和 id_ed25519.pub (公钥) 两个文件。注意: 如果使用 rsa算法,文件名为id_rsa
    2. 把公钥添加到 GitHub:

      • 用文本编辑器打开 ~/.ssh/id_ed25519.pub(或者~/.ssh/id_rsa.pub),复制里面的全部内容。
      • 在 GitHub 网站上,进入 "Settings" -> "SSH and GPG keys"。
      • 点击 "New SSH key"。
      • "Title" 随便填个好记的名字,"Key" 粘贴刚才复制的公钥内容。
      • 点击 "Add SSH key"。
    3. 测试 SSH 连接:

      • 在 Git Bash 或终端中输入 ssh -T git@github.com
      • 如果看到类似 "Hi username! You've successfully authenticated..." 的消息,就说明 SSH 连接成功了。
  • 命令行指令
    生成key

ssh-keygen -t ed25519 -C "your_email@example.com"

测试key

ssh -T git@github.com
  • 安全建议:

    • 绝对不要把私钥泄露给任何人! 放到网盘、发邮件、传给别人,都是非常危险的。
    • 可以给 SSH 密钥设置密码(passphrase),这样每次使用私钥时都需要输入密码,更安全。

3. 确保 VS Code 使用了正确的 SSH Agent

有些时候,即使密钥配置好了,VS Code 还是找不到它们。 这时候,就需要检查一下 SSH Agent 是否在工作。

  • 原理:
    SSH Agent 是一个帮你管理私钥的程序,它会在后台运行,当你需要使用私钥时,它会帮你自动提供,不用你每次都手动输入密码(如果你设置了密码的话)。

  • 操作步骤(Windows):

    1. 检查 SSH Agent 服务是否启动:

      • Win+R,输入 services.msc,回车。
      • 找到 "OpenSSH Authentication Agent",看看它的状态是不是 "正在运行"。
      • 如果不是,右键点击它,选择 "启动"。
      • 为了方便,可以把它的 "启动类型" 设置为 "自动"。
    2. 把私钥添加到 SSH Agent:

      • 打开 Git Bash。
      • 输入 eval $(ssh-agent -s)
      • 这行命令的目的是启动 SSH 代理(ssh-agent),并设置必要的环境变量,以便后续的 SSH 命令能够与该代理通信。
      • 输入 ssh-add ~/.ssh/id_ed25519(或者ssh-add ~/.ssh/id_rsa,根据你的私钥文件名修改)。如果私钥有密码,会提示你输入密码。
  • 操作步骤(macOS / Linux):
    SSH Agent 一般是自动启动的.如果没有, 可以手动执行下面指令启动:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519 # 或者 ssh-add ~/.ssh/id_rsa
  • 命令行指令
# 查看服务状态(Windows)
Get-Service ssh-agent

# 启动服务(Windows)
Start-Service ssh-agent

# 设置服务自动启动(Windows)
Set-Service ssh-agent -StartupType Automatic

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

# 将ssh key 加入管理
ssh-add ~/.ssh/id_ed25519 # or ssh-add ~/.ssh/id_rsa

4. (进阶) 配置 VS Code 的 Git 扩展

如果你使用了多个 GitHub 账户,或者有更复杂的 SSH 配置需求,可以尝试配置 VS Code 的 Git 扩展。

  • 原理:
    VS Code 的 Git 扩展允许你为不同的仓库指定不同的 SSH 密钥,或者使用自定义的 SSH 配置文件。

  • 操作步骤

  1. 打开 .git/config文件. 在项目根目录下面.
  2. 修改 [remote "origin"] 的配置
  • 修改方法一:指定特定 SSH 密钥文件

    如果对不同仓库希望使用不同的密钥,可以在项目的 .git/config 配置文件中针对性设置。

[remote "origin"]
    url = git@github.com:your_username/your_repo.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    sshCommand = ssh -i ~/.ssh/your_custom_private_key
*   把 `your_custom_private_key` 换成你实际的私钥文件名。
  • 方法二:利用 SSH config 文件进行管理 (推荐)

    这个方法可以帮你更好地管理多个 SSH 密钥,不需要修改每一个项目的config文件。

    1. 创建或编辑 SSH 配置文件:

      ~/.ssh/ 目录下创建或编辑 config 文件(没有后缀名)。

    2. 添加配置项:

      Host github.com-your_alias  # 自定义一个别名
          HostName github.com
          User git
          IdentityFile ~/.ssh/your_private_key_for_this_alias
          IdentitiesOnly yes
      

      your_alias, your_private_key_for_this_alias换成你的配置
      IdentitiesOnly yes 参数非常重要。它告诉 SSH 客户端,在连接到匹配的主机时,只使用 IdentityFile 中指定的密钥文件进行身份验证.

    3. 修改 .git/config 中url

     [remote "origin"]
         url = git@github.com-your_alias:your_username/your_repo.git #注意:github.com 变成了你自己定义的别名。
         fetch = +refs/heads/*:refs/remotes/origin/*
    
    

    这样做的好处: 假设你还有一个gitlab 的私钥.你可以在 ~/.ssh/config文件中, 配置不同的 Host 别名和IdentityFile 文件. 而无需修改项目的 .git/config .

         Host github.com-work  # 工作用的 GitHub 账户
             HostName github.com
             User git
             IdentityFile ~/.ssh/id_rsa_work
             IdentitiesOnly yes
    
         Host gitlab.com-personal  # 个人用的 GitLab 账户
             HostName gitlab.com
             User git
             IdentityFile ~/.ssh/id_rsa_personal
              IdentitiesOnly yes
    
    

5.重装 vscode git 插件 (终极方案)

如果上面的方法都不起作用,可以尝试卸载,并重新安装 vscode 中的 git 插件. 这个方法, 可以清除一些可能有问题的旧配置。

通过这些步骤,基本能解决 Windows + VS Code + GitHub 公钥配置的各种疑难杂症,让你顺畅地推拉代码! 如果还有问题, 那只能说, 哥们你太倒霉了...可以考虑重装系统试试...开个玩笑,欢迎在评论区继续提问。