根本原因是 git 远程地址为 https 格式且 ssh agent 未运行或密钥未加载;需先改 remote url 为 git@github.com:user/repo.git,再执行 eval "$(ssh-agent -s)" 和 ssh-add ~/.ssh/id_ed25519,并确保私钥权限为 600。

VSCode 里 Git 推送报 Permission denied (publickey),根本原因不是 VSCode 没配好,而是 Git 命令本身在终端里就走不通——VSCode 只是复用了你系统的 shell 环境。
检查当前 remote 地址是不是 SSH 格式
VSCode 的 Git 面板不会主动帮你把 HTTPS 改成 SSH。如果你 clone 的是 https://github.com/user/repo.git,后续所有 push/pull 都会走 HTTPS 协议,哪怕你生成了密钥也没用。
- 进项目根目录,打开 VSCode 集成终端(
Ctrl + `),运行:git remote get-url origin - 如果输出是
https://...,必须手动改掉:git remote set-url origin git@github.com:user/repo.git - 改完再运行一次
git remote get-url origin确认已变成git@...开头
验证 SSH 密钥是否真能被 git 调用
VSCode 启动时会加载系统 shell(如 PowerShell 或 Git Bash)的环境,但不保证自动启动 ssh-agent 或加载私钥。很多“免密失败”其实卡在这一步。
- 在 VSCode 终端里执行:
ssh -T git@github.com - 如果返回
Welcome to GitHub, xxx!,说明密钥可用;如果仍报Permission denied (publickey),说明 agent 没加载或权限不对 - 补救操作(仅需一次):
eval "$(ssh-agent -s)",然后ssh-add ~/.ssh/id_ed25519(路径按你实际生成位置调整) - Windows 用户注意:
~/.ssh/id_ed25519实际路径通常是C:Users你的用户名.sshid_ed25519
确保私钥文件权限严格(尤其 Windows WSL 或 Git Bash)
OpenSSH 对私钥权限敏感。如果私钥被设为“所有人可读”,ssh-add 会静默拒绝加载,导致后续所有 SSH 操作失败。
- 在 Git Bash 中运行:
chmod 600 ~/.ssh/id_ed25519 - PowerShell 不支持
chmod,可改用:icacls ~/.ssh/id_ed25519 /reset /inheritance:r /grant:r "$env:USERNAME:(R)" - 别碰
id_ed25519.pub权限,它本来就要公开
VSCode 自身配置只需确认 git.path 正确
VSCode 不需要单独“登录 GitHub”或填账号密码。它只依赖系统 Git 和你终端里的 SSH 环境。唯一要核对的是它有没有找到真正的 git.exe。
- 打开设置(
Ctrl + ,),搜git.path - 点“在 settings.json 中编辑”,确认值是类似:
"git.path": "C:\Program Files\Git\bin\git.exe" - 注意:不能填
cmd\git.exe(那是 cmd 封装器),必须是bin\git.exe,否则 SSH 不生效 - 改完重启 VSCode 终端(关掉再开一个
Ctrl + `)
最常被忽略的其实是 ssh-agent 没持续运行,以及 remote URL 还卡在 HTTPS。这两点没搞定,其他所有操作都是白忙。











