1. 先别急着删仓库pre-receive hook declined 到底卡在哪git push报出! [remote rejected] master - master (pre-receive hook declined)的时候很多人第一反应是「远程仓库坏了」或者「权限没配好」然后开始删仓库重建。我试过几次之后发现这个报错本身其实非常「诚实」它只说明服务端的pre-receive钩子拒绝了这次推送但拒绝的原因可能来自分支保护、默认分支缺失、提交信息不合规、大文件超限甚至只是本地凭据用错了账号。pre-receive hook declined是 Git 服务端在真正写入引用之前触发的钩子返回了非零退出码。它和remote rejected是同一件事的两面remote rejected是客户端看到的结论pre-receive hook declined是服务端给出的理由。理解这一点很关键因为排查方向不在本地git命令本身而在「服务端规则 本地身份」这两端。这篇文章面向的是正在往已有远程仓库推送master分支、却被钩子拦下来的开发者。我会把三条排查线讲清楚服务端钩子与分支保护、默认分支是否存在、本地凭据是否指向了正确的账号。同时给出一套可复制的git remote配置片段、一张报错对照表以及一次完整的 push 验证动作。最后说明怎么用 TaoToken 的统一 Key 和 API 通道把多个工具、多个仓库的凭据管理收敛到一处避免「换个仓库就换一套 Key」的混乱。适合谁看刚接手一个已有远程仓库、准备推master却被拒的人团队里负责配分支保护、需要给同事解释报错的人以及同时用多个 AI 编码工具、想统一管理 API 凭据的人。2. 用 TaoToken 统一 Key 与 API 通道先把身份这端理干净在排查pre-receive hook declined之前有一个容易被忽略的前提你本地用的凭据到底代表哪个账号很多「钩子拒绝」的根因其实是推送者账号没有目标分支的写权限而账号错乱的来源往往是本地同时存在多套凭据。TaoToken 在这里的价值是把「模型调用」和「代码工具」的凭据收敛成一套统一 Key。它的官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 。你可以把它理解成一个统一的凭据与通道管理层多个 AI 编码工具、多个项目共用同一套 Key而不是每个工具各配一份、各记一份。具体到 Git 推送场景TaoToken 不直接参与git push的认证但它能帮你把「工具侧的身份」和「仓库侧的身份」分开管理。工具侧用 TaoToken 的统一 Key 调模型仓库侧用 Git 自己的凭据SSH Key 或 HTTPS Token推送。两边不混用排查时就不会出现「我明明换了账号为什么还是被拒」的困惑。如果你需要先拿到统一 Key可以走这个路径先访问 https://taotoken.net/api-keys 在控制台里创建或查看 Key。控制台入口是 https://taotoken.net/console 。创建好之后把 Key 配到你的编码工具里而不是配到 Git 的 remote URL 里——这一点后面会反复强调。对于长期做编码、跑 Agent 任务的场景可以考虑 Coding Plan入口是 https://taotoken.net/coding-plan 。它适合那种「一天要跑很多次模型调用、又不想每次手动换 Key」的用法。模型对话验证入口在 https://taotoken.net/models 接入文档在 https://taotoken.net/doc 。Claude Code 相关配置可以参考 https://taotoken.net/claudecode 。注意TaoToken 的 Key 用于模型与 API 通道不要把它当成 Git 仓库的访问令牌塞进 remote URL。两者职责不同混用会让排查更乱。3. 可复制配置git remote 片段与凭据分离先把本地 remote 配置理清楚。查看当前 remotegit remote -v典型输出可能是origin https://github.com/your-org/your-repo.git (fetch) origin https://github.com/your-org/your-repo.git (push)如果你用的是 HTTPS推送时会走凭据管理器。建议把 remote 显式写成带用户名占位的形式避免凭据管理器自动填了错误账号git remote set-url origin https://your-namegithub.com/your-org/your-repo.git如果你用 SSH改成git remote set-url origin gitgithub.com:your-org/your-repo.git然后确认本地分支和上游git branch -vv git push -u origin master如果服务端要求推送到非master分支比如main先本地改名再推git branch -M main git push -u origin main凭据分离的关键动作把模型工具的 Key 放在工具配置里把 Git 的凭据放在 Git 自己的凭据存储里。以 HTTPS 为例可以清掉旧的缓存凭据再重新输入git config --global --unset credential.helper git config --global credential.helper store这样下次推送会重新提示输入用户名和 Token避免用到过期或错误的账号。SSH 场景则检查~/.ssh/config里的 Host 与 IdentityFile 是否指向正确密钥ssh -T gitgithub.com返回的账号名就是这次推送真正使用的身份。如果这个账号没有目标仓库的写权限pre-receive hook declined几乎必然出现。4. 报错对照表把 pre-receive 提示翻译成人话服务端钩子拒绝时remote:前缀后面通常会跟一行具体原因。下面这张表把常见提示和对应处理列出来方便你直接对号入座。服务端提示关键词含义处理动作default branch/no default branch远程仓库没有默认分支让有管理权限的人先创建默认分支再重新推送protected branch/branch is protected目标分支受保护走 MR/PR 流程或请管理员调整保护规则pre-receive hook declined且无更多信息钩子返回非零但未输出原因查服务端钩子日志或联系仓库管理员commit message/commit-msg提交信息不符合规范按规范改写提交信息后重推file size/large file单文件超过限制用 Git LFS 或移除大文件后重推permission/not allowed当前账号无写权限换有权限的账号或申请权限non-fast-forward远程有本地没有的提交先git pull --rebase再推其中「远程仓库没有默认分支」是最容易被误判的一类。excerpt 里提到的那种情况——错误提示里明确指向默认分支缺失——处理方式就是让有管理权限的人在服务端创建默认分支之后重新推送即可。注意这里的关键是「有管理权限的人」普通开发者自己改本地配置是没用的因为规则在服务端。另一类高频原因是分支保护。很多团队把master设为保护分支禁止直接 push只允许通过合并请求进入。这种情况下pre-receive hook declined是预期行为不是故障。你需要做的是建一个特性分支推上去然后开 MRgit checkout -b fix/push-rejected git push -u origin fix/push-rejected推特性分支通常不会被保护规则拦因为保护规则一般只作用于master或main。5. 一次完整 push 验证从被拒到成功下面走一遍完整流程把「复现 → 定位 → 修复 → 验证」串起来。第一步复现。在本地确认当前分支和 remotegit status git remote -v git branch -vv执行推送观察完整输出git push origin master如果看到! [remote rejected] master - master (pre-receive hook declined) error: failed to push some refs to https://...先别改代码去看remote:开头的行。那行才是真正的原因。第二步定位身份。确认这次推送用的账号ssh -T gitgithub.com或对 HTTPS 场景清缓存后重推看提示输入的是哪个账号。第三步定位规则。如果提示指向默认分支缺失联系管理员创建默认分支如果指向保护分支改推特性分支git checkout -b fix/push-rejected git push -u origin fix/push-rejected第四步验证成功。推送成功后输出应该类似Enumerating objects: 12, done. Counting objects: 100% (12/12), done. Writing objects: 100% (7/7), 1.2 KiB | 1.2 MiB/s, done. To https://github.com/your-org/your-repo.git * [new branch] fix/push-rejected - fix/push-rejected branch fix/push-rejected set up to track fix/push-rejected.看到[new branch]或master - master且没有rejected字样就说明钩子放行了。如果推的是master且成功输出会是To https://github.com/your-org/your-repo.git a1b2c3d..e4f5g6h master - master第五步回到工具侧。确认你的编码工具用的是 TaoToken 统一 Key而不是把 Git 凭据和模型 Key 混在一起。模型调用验证可以走 https://taotoken.net/models 接入配置参考 https://taotoken.net/doc 。这样两边身份清晰下次再遇到remote rejected你能立刻判断是仓库侧还是工具侧的问题。6. 本篇常见错排查那些让人绕远路的坑第一个坑把pre-receive hook declined当成网络问题。它不是网络错误是服务端主动拒绝。重试、换网络、重启电脑都不会有用。第二个坑直接git push -f。强制推送在保护分支上同样会被钩子拦而且可能覆盖别人的提交。在没搞清楚原因前不要用-f。第三个坑改本地user.name/user.email以为能解决。这两个配置只影响提交作者信息不影响推送认证身份。推送身份由 SSH Key 或 HTTPS 凭据决定。第四个坑把 TaoToken 的 Key 填进 Git remote URL。前面强调过模型 Key 和仓库凭据是两套东西。填错会导致认证失败报错可能伪装成权限问题。第五个坑忽略remote:那一行。很多人只看最后一句error: failed to push some refs但真正的原因在remote:前缀的输出里。养成先看remote:的习惯能省一半排查时间。第六个坑默认分支缺失时自己反复重推。这种情况本地做什么都没用必须服务端有人创建默认分支。确认提示里是否出现default branch相关字样是判断依据。如果你在排查过程中需要确认模型通道是否正常可以先用模型对话入口 https://taotoken.net/models 做一次简单调用确认 Key 有效。需要管理或新建 Key 时走 https://taotoken.net/api-keys 控制台在 https://taotoken.net/console 。长期跑编码任务、Agent 工作流的话Coding Plan 入口是 https://taotoken.net/coding-plan 接入细节看 https://taotoken.net/doc Claude Code 配置参考 https://taotoken.net/claudecode 。把这些入口按用途分开用凭据就不会再打架。
