Git Push反复弹密码框是因为使用HTTPS协议且凭据未正确配置或缓存了过期PAT;应清理旧凭据、配置系统级credential.helper(Windows用manager-core、macOS用osxkeychain)、改用Personal Access Token替代密码,或一劳永逸切换为SSH协议认证。

Git Push反复弹密码框,不是 VSCode 的问题,而是 Git 正在用 HTTPS 协议做基础认证,且凭据没存住或存的是过期/无效的 Personal Access Token(PAT)。GitHub、GitLab、Gitee 全部已停用密码登录,输密码必然失败。
为什么输对账号密码还是报错
常见错误现象包括:Support for password authentication was removed on August 13, 2021、Missing or invalid credentials、Incorrect username or password。这些提示本质是 Git 拿着旧凭据(比如过期 token、空密码、甚至纯密码)反复重试,根本不会弹新窗口让你换。
- GitHub/GitLab/Gitee 都不再接受明文密码,必须用
ghp_*(GitHub)、glpat-*(GitLab)、gitee_*(Gitee)开头的 Personal Access Token - VSCode 调用的是系统 Git,凭据管理器(Windows Credential Manager / macOS Keychain / Linux libsecret)若缓存了错误条目,新配置不会自动覆盖
-
git config --global credential.helper store会把凭据明文写进~/.git-credentials,Linux/macOS 可用,但 Windows 用户不推荐——容易权限混乱、被杀毒软件拦截
Windows 用户:清旧凭据 + 配 manager-core
这是最稳的路径,不依赖文件存储,走系统级凭据管理。
- 打开「控制面板 → 用户账户 → 凭据管理器 → Windows 凭据」
- 在「普通凭据」里找到所有以
git:开头的条目(如git:https://gitee.com、git:https://github.com),全部删除 - 在终端执行:
git config --global credential.helper manager-core - 进任意 repo 执行一次
git pull,弹窗出现后:- Username 填你的 GitHub/Gitee 用户名(不是邮箱)
- Password 粘贴你生成的 Personal Access Token(
ghp_...或gitee_...)
macOS 用户:用 osxkeychain + 清 Keychain 条目
macOS 的 Keychain 有时会卡住旧 token,光配 helper 不够,得手动清理。
- 执行:
git config --global credential.helper osxkeychain - 打开「钥匙串访问」App,搜索
github.com、gitee.com等关键词 - 找到类型为 «internet password» 的条目,双击 → 「显示密码」需解锁,确认是旧 token 后直接删掉
- 在终端执行
git pull,填入用户名和新 token,Keychain 会自动记住
改用 SSH 是一劳永逸的方案
HTTPS + PAT 方式仍要维护 token 有效期和权限;SSH 则完全绕过密码/PAT 流程,适合长期使用或多个账号场景。
- 生成密钥时别用默认名,避免冲突:
ssh-keygen -t ed25519 -C "me@work.com" -f ~/.ssh/id_ed25519_work - 加到 ssh-agent:
eval "$(ssh-agent -s)"→ssh-add ~/.ssh/id_ed25519_work - 公钥内容复制进 GitHub/Gitee 的 SSH Keys 设置页(注意别漏空格)
- 把远程地址换成 SSH 格式:
git remote set-url origin git@github.com:user/repo.git - 多账号必须配
~/.ssh/config,否则git@gitlab.com无法区分该用哪个私钥
最容易被忽略的是:旧凭据不清理,新配置就永远不生效。尤其是 Windows 用户删错地方(比如只删了「Web 凭据」却漏掉「Windows 凭据」),或者 macOS 用户没在钥匙串里搜全域名变体(github.com 和 api.github.com 是两条记录)。token 本身也要检查权限是否勾选了 repo 和 write_repository,缺一不可。


















