VSCode免密提交失败的根本原因在于remote URL未切换为SSH格式、私钥权限不正确或git.exe路径配置错误。需先用git remote get-url origin确认URL,若为HTTPS则执行git remote set-url origin git@host:user/repo;再检查私钥权限(chmod 600 ~/.ssh/id_ed25519)、确保ssh-agent已加载密钥,并在settings.json中正确配置git.path指向Git安装目录下的bingit.exe。

免密提交在 VSCode 里根本不是“VSCode 配置问题”,而是 Git 命令在终端里是否走通 SSH 协议 + 密钥是否被正确加载。HTTPS 地址永远要输密码或 Token,改不掉;SSH 地址配错权限、没启 agent、没加私钥,照样报 Permission denied (publickey)。
怎么确认 remote 地址是不是 SSH 格式
VSCode 的 Git 面板不会自动把 HTTPS 换成 SSH。你 clone 时用的是 https://github.com/user/repo.git,后续所有 git push 都走 HTTPS——哪怕你生成了密钥也没用。
- 进项目根目录,在 VSCode 集成终端(
Ctrl + `)运行:git remote get-url origin - 如果输出是
https://开头,必须立刻改掉:git remote set-url origin git@github.com:user/repo.git(GitHub)或git@gitee.com:user/repo.git(Gitee) - 再跑一次
git remote get-url origin确认已变成git@开头 - 验证是否真能连通:
git ls-remote origin,无报错即成功;报错就停在这步,别往下走
为什么 ssh-add 后还是 Permission denied (publickey)
常见现象:终端里执行 ssh-add -l 能看到密钥,但 git push 仍失败。根本原因不是密钥没生成,而是私钥文件权限太松、agent 没被 Git 进程继承、或 Windows 下路径解析错位。
- 私钥必须严格为
600:chmod 600 ~/.ssh/id_ed25519(Git Bash / macOS / Linux) - Windows PowerShell 不支持
chmod,改用:icacls ~/.ssh/id_ed25519 /reset /inheritance:r /grant:r "$env:USERNAME:(R)" - 确保
~/.ssh目录权限是700:chmod 700 ~/.ssh - VSCode 启动时未必加载
ssh-agent,每次新开终端都得手动启动:eval "$(ssh-agent -s)",再ssh-add ~/.ssh/id_ed25519 - Windows 用户注意:
~/.ssh/id_ed25519实际路径通常是C:Users你的用户名.sshid_ed25519,ssh-add时得写全路径或切换到该目录再执行
VSCode 终端找不到 git.exe 或 SSH 不生效
VSCode 默认调用系统 shell 中的 git,但如果它底层用的是错误的 git.exe 封装器(比如 cmdgit.exe),SSH 协议就会静默降级为 HTTPS,导致免密失效。
- 打开 VSCode 设置(
Ctrl + ,),搜git.path - 点“在 settings.json 中编辑”,确认值是类似:
"git.path": "C:\Program Files\Git\bin\git.exe" - 绝对不能填
cmd\git.exe或usr\bin\git(WSL 路径),必须是bin\git.exe - 改完保存,关掉所有集成终端(
Ctrl + `关闭再重开),否则环境变量不会刷新 - 在新终端里运行
which git或where git,确认路径和git.path一致
git push origin --tags 为什么推不上远程标签
VSCode 的 Git 面板默认只推送分支,不推送标签。即使你本地用 git tag -a v1.0.0 -m"..." 创建了附注标签,它也不会随 push 按钮一起发出去。
- 必须显式推送:
git push origin v1.0.0(单个)或git push origin --tags(全部) - VSCode 源代码管理侧边栏右上角 “⋯” 菜单里有 “Push Tags”,点它等价于
git push origin --tags - 轻量标签(
git tag v1.0.0)不建议推送,因为它不含作者、时间、签名等元信息,CI/CD 工具通常忽略 - 批量推送
--tags有风险:若本地误建了测试标签(如v1.0.0-test),会一并推到远程,清理麻烦
真正卡住人的从来不是“怎么生成密钥”,而是 remote URL 没切到 SSH、私钥权限被系统拒绝加载、或者 VSCode 调用的 git.exe 根本不走 OpenSSH。每一步都要单独验证,别跳步。


















