Git推送权限不足本质是服务端授权失败,需先确认协议(HTTPS需Token、SSH需密钥有效),再检查远程地址、凭据缓存、分支保护规则及仓库成员权限。

Git推送提示权限不足,不是密码输错了,而是你根本没被授权往那个分支写——或者凭证压根没生效。
确认远程地址用的是 HTTPS 还是 SSH
这是所有权限问题的起点。Git 不会自动帮你切换协议,它只认你 git remote set-url 设的地址。
- 运行
git remote get-url origin,看输出是不是以https://或git@开头 - 如果是
https://gitee.com/xxx或https://github.com/xxx:你走的是 HTTPS 认证,必须用 Token(不是密码) - 如果是
git@gitlab.com:xxx:你走的是 SSH 认证,ssh -T git@gitlab.com必须能成功返回欢迎信息 - 常见坑:VSCode 里点 Push 失败,但你在终端里手动
git push成功?那大概率是 VSCode 没读到你的 shell 环境变量或 ssh-agent —— 它复用的是你启动时的环境,不是当前终端里刚eval出来的
HTTPS 协议下 Token 配置失败的典型表现
报错里带 403 Forbidden、remote: Invalid username or token 或直接弹出密码框但输啥都错,基本就是 Token 没配对。
- Windows 用户先去「控制面板 → 凭据管理器 → Windows 凭据」,删掉所有含
gitee.com或github.com的条目 - Mac 用户打开「钥匙串访问」,搜
gitee,删掉对应「互联网密码」 - 生成 Token 时,Gitee 要勾选
repo权限,GitHub 要勾选write:packages和workflow(如果用 CI),至少不能漏public_repo或repo - Token 只显示一次,复制完立刻存好;下次推送时,“密码”栏粘贴它,用户名填注册邮箱或账号名(Gitee 支持手机号,GitHub 必须用账号名)
SSH 私钥加载失败的三个硬性条件
哪怕你 ssh-keygen 生成了密钥,只要下面任一条件不满足,git push 就会卡在 Permission denied (publickey)。
- 远程 URL 必须是
git@github.com:user/repo.git格式,不是https://——git remote set-url origin得亲手改 - 私钥文件权限必须是
600:chmod 600 ~/.ssh/id_ed25519(Git Bash / WSL);PowerShell 用户用icacls命令重置权限 - 必须运行
eval "$(ssh-agent -s)"启动 agent,再ssh-add ~/.ssh/id_ed25519加载密钥;VSCode 启动后不会自动做这两步,得在它的集成终端里手动执行
推送被拒但凭证和协议都对?查分支保护规则
这时候报错通常是 remote: GitLab: You are not allowed to push code to protected branches 或类似提示,说明服务端放行了你的身份,但拦住了你的操作。
- 登录 Gitee/GitHub/GitLab,进项目「设置 → 分支保护规则」,看
main或master是否启用了「允许推送」限制 - 规则若设为「仅维护者」,而你是「开发者」角色,那就推不了——这不是配置问题,是权限申请问题
- 有些平台还要求 PR + Code Review 通过才允许合并,这种情况下你不能直推,得走 Pull Request 流程
- 临时验证:尝试推一个新分支
git push origin HEAD:dev-test,如果成功,基本锁定是目标分支受保护
最常被忽略的一点:报错里出现 403 时,别急着重输密码或重装 Git;先确认你有没有被加进仓库成员列表、目标分支是否开放写入、Token 权限是否开全——这些服务器端策略,本地配得再完美也绕不过去。











