Mac Git推送权限拒绝主因是协议凭据冲突:HTTPS需清理钥匙串中过期的git:https://条目并重输PAT;SSH需检查密钥存在性、加载到ssh-agent、禁用钥匙串干扰,并用ssh -T验证;另需区分pre-receive hook(分支保护)与remote Permission to(无协作者权限)两类根本不同问题。

MacOS 上 Git 推送报权限拒绝(如 Permission denied (publickey) 或 remote: Permission to user/repo denied),多数不是账号没权限,而是本地凭据或密钥被旧配置覆盖、冲突或失效。关键在区分是 SSH 认证失败,还是 HTTPS 凭据错配,再针对性清理。
先确认你用的是哪种协议
执行:git remote -v
看输出里 push 地址是以 https:// 还是 git@ 开头:
- 如果是
https://github.com/xxx/yyy.git→ 问题大概率出在「钥匙串」里缓存了过期的用户名/密码或 Personal Access Token - 如果是
git@github.com:xxx/yyy.git→ 问题大概率出在 SSH 密钥未加载、公钥没上传,或钥匙串里存了多个同名但权限不同的 SSH 条目
HTTPS 协议:清空钥匙串里的 git 凭据
Mac 的钥匙串会自动保存 HTTPS 登录态,且可能存多个同域名条目(比如一个叫 github.com,另一个叫 git:https://github.com),容易互相干扰:
- 打开「钥匙串访问」App
- 左上角搜索框输入
github.com(或你实际用的域名,如gitlab.com、your-company.gitlab.internal) - 找到类型为 internet password、服务器为对应域名、账户名为
git或你的邮箱的条目 - 逐个右键 → 「删除」(别点「编辑」,改空值反而让 Git 继续用坏凭据)
删完后,在终端运行一次 git push,系统会弹出新认证窗口,这时输正确的账号 + Personal Access Token(GitHub/GitLab 启用 2FA 后必须用 token 替代密码)。
SSH 协议:检查密钥链与钥匙串冲突
Mac 有个特殊行为:即使你手动启用了 ssh-agent 并添加了私钥,钥匙串仍可能自动拦截 SSH 连接并提供错误密钥:
CNB 云原生构建平台的 Git 操作技能,支持代码克隆、提交、推送、分支管理、Merge Request 管理、流水线触发与结果读取。初次使用需收集用户的 Git 用户名和邮箱。
- 先确认密钥存在:
ls -al ~/.ssh/id_*(常见为id_rsa或id_ed25519) - 启动 agent 并加载:
eval "$(ssh-agent -s)"→ssh-add ~/.ssh/id_ed25519 - 临时禁用钥匙串对 SSH 的管理:在终端运行
ssh-add -D清空所有已知密钥,再ssh-add -K ~/.ssh/id_ed25519(-K表示存入钥匙串,但只存这一个) - 验证是否通:
ssh -T git@github.com→ 显示You've successfully authenticated才算过关
如果仍报错,去钥匙串里搜 ssh,把类型为 SSH key 的无关条目也删掉,避免干扰。
检查远程仓库权限本身是否有效
凭据和密钥都对,还被拒?可能是权限层级问题:
- 出现
pre-receive hook declined→ 远程分支(如 main)被保护,禁止直推。你要推到新分支:git checkout -b feat/new→git push origin feat/new,再提 PR - 出现
remote: Permission to xxx/yyy denied→ 你根本没被加进该仓库协作者列表。要么联系管理员加你,要么先 Fork 到自己账号下,再推送到自己的 fork
不复杂但容易忽略。

















