科技 · 实用指南
Git push 提示“pre-receive hook declined”?改写提交前先保留远端拒绝原因
这条摘要只能证明远端在更新引用前拒绝了操作,不能说明具体违反哪条规则。先保存远端输出、引用映射和规则负责人,再只修复已证实的边界。

把“pre-receive hook declined”当作远端决策发生的位置,而不是原因。真正有用的证据通常在前面的 remote 输出、准确的引用更新和托管平台策略中。
在 reset、强推、删文件或要求管理员放宽规则前,先建立脱敏拒绝台账,并把修复交给控制该边界的贡献者、维护者或服务器管理员。
1. 固定准确拒绝现场
保存从第一条 remote: 行到所有被拒引用的完整输出。记录脱敏远端 URL、传输方式、本地源、远端目标、有效账号、时间和 Git 版本;共享时删除凭据和私有仓库名。
不要先 reset、rebase、强推或删文件,这些操作可能破坏用于确定哪条提交、路径、签名、对象或引用触发拒绝的载荷。
2. 证明决策在哪里执行
Git 将 pre-receive 定义为接收端仓库在更新前读取旧对象 ID、新对象 ID 和完整引用名的钩子。它非零退出会拒绝接收,因此本地提交钩子的绕过参数无关。
区分 pre-receive、逐引用 update 拒绝和 post-receive 错误。保留括号中的原因和全部 remote 消息,因为平台可能用通用摘要包装策略引擎或自定义钩子的决定。
3. 按第一条具体 remote 信息分流
若平台点名受保护分支、权限、提交信息、作者邮箱、签名、文件名、大小、标签删除、秘密或缺失 LFS 对象,就核对那条规则及其当前作用域,不要套用搜索结果里的热门原因。
没有有用提示时,由仓库维护者检查推送规则和受保护引用,服务器管理员检查钩子代码、日志和超时;贡献者只需保留失败引用并提供旧/新 ID。
4. 编辑前证明违规载荷
映射每个被拒的源与目标,并把拟推送范围和远端引用比较。只按已点名的规则检查提交元数据、变更路径、对象大小、签名和 LFS 指针。多引用或镜像推送应逐引用举证。
记录失败对象或策略检查及其负责人。贡献者可修订提交或补传 LFS 对象,维护者可调整权限或项目规则,只有服务器所有者能修复坏掉的自定义钩子或超时。
5. 做最小修复并验收
只修改已证实的边界,再重试同一预期引用更新。不要为一条推送削弱共享规则;除非远端策略允许且确实要改写历史,否则不要强推。
确认远端引用指向预期对象 ID、所有目标引用均已接受,并保留脱敏拒绝与验收记录。若仍只有通用提示,就回到最早未解释的 remote 行或服务器日志。
