git提交到GitHub报错 pre-receive hook declined?用TaoToken排查远端拒绝的完整思路 1. 从一次真实的 push 被拒说起pre-receive hook declined 到底是什么你敲下git push origin master终端没有像往常一样滚动出Writing objects: 100%而是甩回来这么一段! [remote rejected] master - master (pre-receive hook declined) error: failed to push some refs to gitgithub.com:xxx/xxx.git第一反应通常是「网络问题吧」于是重试、换网络、重启终端结果一模一样。这个报错的关键词是pre-receive hook declined翻译成人话就是GitHub 服务端在真正接收你的提交之前跑了一个叫 pre-receive 的钩子脚本这个脚本把你的推送拒绝了。注意拒绝发生在服务端不是你本地 git 的问题也不是网络断了。pre-receive hook 是 Git 服务端在「接收对象之前」执行的检查点。GitHub 用它来做一堆规则校验分支保护、文件大小限制、提交者邮箱验证、仓库是否只读、组织策略等等。任何一条不满足钩子就返回非零你的 push 就被 declined。所以这个报错本身是个「笼统的拒绝信号」真正的原因藏在 GitHub 返回的更靠前的几行里很多人只盯着最后一行就跟我当初一样白折腾半天。这篇面向的场景很具体你 push 到 GitHub 时撞上! [remote rejected] master - master (pre-receive hook declined)想按「分支保护 → 权限 → 仓库状态 → 远端钩子」的顺序逐层定位并且用 TaoToken 把请求链路单独验证一遍确认到底是 GitHub 侧拒绝还是你本地到远端的通道有问题。适合刚上手 Git、被这个报错卡住的开发者也适合想建立一套系统排查思路的人。先说结论方向90% 的情况是文件超过 100MB、分支被保护、或者你没有该分支的写权限。剩下 10% 是仓库归档/只读、组织 SSO 未授权、提交邮箱未验证。下面一层层拆。2. 用 TaoToken 统一 Key 与 API 通道先把「请求链路」这件事验证清楚排查远端拒绝之前有个容易被忽略的前提你得先确认「你本地发出的请求确实能正常到达并走通一条可控的通道」。很多人的环境里同时挂着多个 API Key、多个代理配置、多个 git 的 credential helper出问题时根本分不清是 GitHub 拒绝还是本地通道抽风。TaoToken 在这里的角色是给你一个统一的 Key 和 API 通道把「模型调用 / 请求验证」这类链路收敛到一处管理。它的官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 这个不加 UTM。你可以把它理解成一个统一的接入层一个 Key 管多个模型的调用配置集中排查时不用在五六个地方翻 Key。为什么排查 git 报错要扯到 API 通道因为当你的 push 被拒你需要一个独立的、可复现的请求来验证「我的凭证和网络出口是好的」。如果连一个简单的 API 请求都发不出去那 git 的问题可能根本不在 GitHub而在你本地的网络/凭证环境。反过来如果 API 请求一路 200那基本可以锁定问题在 GitHub 仓库侧的规则上。具体怎么用 TaoToken 做这个验证第一步去控制台拿 Key。打开 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 在 API Keys 页面创建一个新 Key。建议按用途命名比如git-debug-verify方便后面区分。创建后立刻复制页面刷新就看不到了。第二步用这个 Key 发一个最小请求确认通道通。以 curl 为例curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d { model: gpt-4o-mini, messages: [{role: user, content: ping}], max_tokens: 10 }如果返回里有正常的choices字段说明你的 Key、网络出口、API 通道都是通的。这一步的意义在于排除变量通道没问题那 git 的 pre-receive hook declined 就纯粹是 GitHub 侧的规则问题你可以放心大胆地去查分支保护和文件大小不用怀疑网络。第三步如果你在做 Claude Code 或 coding 相关的接入TaoToken 也提供对应的 coding plan 入口https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。把 Base URL 统一指向https://taotoken.net/apiKey 用刚才创建的那个模型 ID 按你实际要用的填。这样你的开发链路和排查链路用的是同一套凭证体系出问题时定位范围小很多。需要提醒的是TaoToken 是帮你统一管理 API 通道和 Key 的它不替代 GitHub也不参与 git 的推送过程。它的价值在于「当你要验证请求链路是否正常时给你一个干净、可控的出口」。排查 git 报错时先证明通道 OK再聚焦 GitHub 规则这是我这几年踩坑总结出来的顺序。3. 可复制的排查配置从分支保护到文件大小的逐层定位这一节是核心给你一套可以直接复制粘贴的命令和检查清单。按顺序来别跳步。3.1 先看完整报错别只看最后一行GitHub 在pre-receive hook declined之前通常会打印真正的原因。把 push 输出完整看一遍git push origin master 21 | tee push.log然后翻push.log找remote:开头的行。常见的有remote: error: GH006: Protected branch update failed for refs/heads/master. remote: error: File xxx.zip is 120.00 MB; this exceeds GitHubs file size limit of 100.00 MB remote: error: Your push was rejected because the email xxxxxx is not verified.看到GH006就是分支保护看到File ... exceeds就是文件超限看到email ... not verified就是邮箱没验证。对症下药。3.2 分支保护检查GH006如果是分支保护去 GitHub 仓库页面Settings → Branches → Branch protection rules。检查master或main是否被保护以及是否勾选了Require a pull request before merging禁止直接 push是否勾选了Require status checks to passCI 没过不让推是否限制了Restrict who can push你的账号不在白名单如果你只是想临时推上去可以取消保护或者改用 PR 流程。团队仓库不建议直接关保护走 PR 更规范。3.3 文件大小检查超过 100MB 直接拒这是最常见的坑。GitHub 规则单文件超过 50MB 警告超过 100MB 直接拒绝 push。先找出大文件# 找出当前工作区里超过 50MB 的文件 find . -type f -size 50M -not -path ./.git/* -exec ls -lh {} \; # 找出 git 历史里所有大对象含已删除的 git rev-list --objects --all | \ git cat-file --batch-check%(objecttype) %(objectname) %(objectsize) %(rest) | \ awk /^blob/ {print $3, $4} | sort -rn | head -20如果大文件在最新提交里直接删掉再提交git rm --cached path/to/bigfile.zip echo path/to/bigfile.zip .gitignore git commit -m remove big file git push origin master如果大文件在历史提交里已经 commit 过光删当前文件没用历史里还在。需要用git filter-repo或 BFG 清理历史# 安装 git-filter-repo 后 git filter-repo --path path/to/bigfile.zip --invert-paths git push origin master --force注意--force会重写历史团队协作仓库要提前通知所有人重新 clone。清理前务必备份这个操作不可逆。3.4 权限与仓库状态检查如果报错里没有明确原因检查这几项你对这个仓库有没有write权限在Settings → Collaborators或组织权限里确认。仓库是不是被archive归档了归档仓库只读不能 push。组织是否开启了SAML SSO开了的话你的 PAT 或 SSH Key 需要授权去Settings → Applications里给对应 token 授权。提交邮箱是否和 GitHub 账号绑定且已验证git config user.email看一下。3.5 用 TaoToken 验证请求链路配置片段在排查 GitHub 规则的同时用 TaoToken 确认你的请求通道正常。如果你在用 Claude Code 或类似工具配置可以写成这样以 settings 风格为例{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的TaoToken Key, ANTHROPIC_MODEL: claude-3-5-sonnet-20241022 } }如果你用的是 Codex 风格的auth.json对应写{ base_url: https://taotoken.net/api, api_key: sk-你的TaoToken Key, model: gpt-4o }三件套记牢Base URL Key Model ID缺一不可。Base URL 统一用https://taotoken.net/apiKey 从控制台拿Model ID 按实际模型填。配置好后发一个测试请求确认返回正常就说明你的通道没问题可以专心查 GitHub 侧。4. 验证请求与成功结果push 恢复的那一刻排查完上面几层改完配置重新 pushgit push origin master成功的输出长这样Enumerating objects: 15, done. Counting objects: 100% (15/15), done. Delta compression using up to 8 threads Compressing objects: 100% (10/10), done. Writing objects: 100% (12/12), 2.34 MiB | 1.20 MiB/s, done. Total 12 (delta 3), reused 0 (delta 0), pack-reused 0 To github.com:xxx/xxx.git a1b2c3d..e4f5g6h master - master看到最后一行master - master没有rejected就是成功了。如果之前是文件超限push 的对象大小会明显变小比如从 120MB 降到几 MB。同时用 TaoToken 的验证请求也应该返回正常curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d {model:gpt-4o-mini,messages:[{role:user,content:verify}],max_tokens:5}返回里有choices就说明通道 OK。两边都通问题闭环。如果你需要更细的接入文档可以看 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里面有各语言的调用示例。模型对话的在线验证入口在 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 可以直接在网页里发一条消息确认 Key 有效。5. 本篇常见报错排查对照表把几个高频报错和对应处理列出来方便你对照报错片段根因处理GH006: Protected branch update failed分支保护禁止直接 push走 PR或临时取消保护File xxx is 120.00 MB; exceeds 100.00 MB单文件超 100MB删文件 清历史 force pushemail ... is not verified提交邮箱未验证验证邮箱或改user.email401 UnauthorizedKey/Token 失效或未授权 SSO重新生成 PAT授权 SSOlocal proxy failed本地代理配置冲突检查http.proxy配置清掉reading choices相关解析错误API 返回结构异常检查 Base URL 和 Model ID 是否匹配OAuth授权失败凭证过期或 scope 不足重新走 OAuth补reposcope几个具体说明401 和 local proxy failed经常一起出现。先看git config --global --get http.proxy如果有值且你不需要代理清掉git config --global --unset http.proxy。然后确认 credential 用的是正确的 PAT。reading choices 报错通常出现在你调 API 时返回体不是预期的 JSON 结构。检查 Base URL 是不是写成了https://taotoken.net/api别漏/apiModel ID 是不是拼错了。三件套对不上就会解析失败。OAuth 授权失败多见于组织 SSO 场景。去 GitHubSettings → Applications → Authorized OAuth Apps找到对应应用重新授权确保勾了reposcope。排查顺序建议先看完整报错 → 定位是分支保护还是文件大小 → 用 TaoToken 验证通道 → 改配置 → 重推。别一上来就 force push容易把别人的提交冲掉。6. 把 Key 和通道收拢到一处下次排查少走弯路回到最开始那个场景! [remote rejected] master - master (pre-receive hook declined)这个报错本质是 GitHub 服务端钩子拒绝了你的推送原因藏在更靠前的输出里。我试过只盯着最后一行找半天最后发现是文件超了 100MB删掉重推就好了。给你几个实用习惯第一push 前先跑一遍大文件检查find . -type f -size 50M几秒钟的事能省掉一次被拒。第二把 API Key 和通道统一管理。TaoToken 的 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 可以集中创建和管理 KeyBase URL 统一用https://taotoken.net/api出问题时先发一个测试请求确认通道再查 GitHub 规则变量少一半。第三长期做 coding 或 Agent 开发的可以看 coding plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 把开发链路的凭证和排查链路的凭证统一定位问题时不用来回切换环境。最后提醒一句清理 git 历史里的超大文件是不可逆操作动手前先git clone一份备份。分支保护能不开就不开在个人仓库团队仓库该开就开走 PR 流程反而更省心。