根本原因是Gitee已停用密码登录,必须使用Personal Access Token(PAT);输错、权限不足、过期或凭据管理器缓存旧token均导致认证失败。

根本原因不是 VSCode 本身,而是 Git 的凭据没存住,或存的是过期/错误的 token —— 尤其 Gitee 已全面停用密码登录,只认 Personal Access Token(PAT)。
为什么输对密码还是报 Incorrect username or password
Gitee 自 2023 年底起已废弃账号密码方式的 Git 认证。你看到的弹窗里填的“密码”,实际必须是 Personal Access Token,不是网站登录密码。输错 token、token 权限不足(缺 repo 或 write_repository)、token 已过期,都会直接报这个错。
常见误操作包括:
- 在 Gitee 的「个人设置 → 私人令牌」里生成 token 时,没勾选
repo(读写私有库必需)和write_repository(push 必需) - 复制 token 时多空格、少字符,或粘贴进弹窗时被自动截断
- 之前存过旧 token,Git 拿着它反复重试,根本不会弹新窗口让你换
Windows 用户:删掉旧凭据再重新存 token
VSCode 调用的是系统 Git,凭据走 Windows 凭据管理器。旧凭据不清理,新配置无效。
操作步骤:
- 打开「控制面板 → 用户账户 → 凭据管理器 → Windows 凭据」
- 在「普通凭据」列表中,找到以
gitee.com开头的条目(可能显示为git:gitee.com) - 点击展开 → 「编辑」→ 把「密码」字段清空,或直接「删除」整条
- 回到 VSCode 终端,执行一次
git pull,弹窗出现后:- Username 填你的 Gitee 用户名(不是邮箱)
- Password 粘贴刚生成的完整
Personal Access Token
Mac / Linux 用户:别用 store,优先配 osxkeychain 或 libsecret
git config --global credential.helper store 会把 token 明文写进 ~/.git-credentials,极不安全,且 Gitee token 一旦泄露等于仓库完全裸奔。
正确做法:
- macOS:运行
git config --global credential.helper osxkeychain,之后首次git pull输入 token,它会被加密存进钥匙串 - Linux(GNOME):装
libsecret和gnome-keyring,再配git config --global credential.helper libsecret - Linux(无桌面环境):用
git config --global credential.helper cache --timeout=3600(缓存 1 小时,比永久明文强)
注意:osxkeychain 和 libsecret 存的是加密凭据,VSCode 重启、系统重启都不丢失;而 cache 依赖 ssh-agent 进程存活,终端关了就失效。
一劳永逸:换 SSH 协议,彻底绕开密码弹窗
HTTPS 地址(如 https://gitee.com/xxx/yyy.git)天生要过 HTTP 认证,再怎么配 helper 都有 fallback 弹窗风险。SSH 地址(git@gitee.com:xxx/yyy.git)只认密钥,只要本地 ~/.ssh/id_ed25519.pub 已添加到 Gitee,就真的一次配置、永远免输。
检查 & 配置步骤:
- 查密钥:
ls -al ~/.ssh/id_*.pub,没输出就先运行ssh-keygen -t ed25519 -C "your_email@gitee.com" - 启动 agent 并加载:
eval "$(ssh-agent -s)" && ssh-add ~/.ssh/id_ed25519 - 复制公钥:
cat ~/.ssh/id_ed25519.pub,粘贴进 Gitee「个人设置 → SSH 公钥」 - 改远程地址:
git remote set-url origin git@gitee.com:yourname/repo.git
改完立刻 git pull 测试 —— 如果还弹窗,大概率是 SSH key 没加对,或 ssh -T git@gitee.com 连不通,这时候得回 Gitee 页面确认公钥是否生效。
最常被忽略的点:Gitee 的 SSH 公钥页面不提示“已生效”,只默默存着;但如果你复制时漏了末尾的 your_email@gitee.com,或用了带换行的文本编辑器复制,公钥就无效——这种问题只能靠 ssh -T 输出来定位。


















