Gogs push 报 "remote rejected: hook declined" 怎么处理
【免费下载链接】gogsThe painless way to host your own Git service项目地址: https://gitcode.com/GitHub_Trending/go/gogs
当你通过 SSH 向自建的 Gogs 服务器推送代码时,如果客户端出现类似下面的拒绝信息:
! [remote rejected] master -> master (hook declined)说明推送请求到达了服务器,但 Git 在更新引用前执行的服务端 hook 脚本没有跑起来,服务器因此拒绝了整个 push。Gogs 的 故障排查文档 针对这个报错给出的可能原因是:Git 无法执行 update hook 脚本。由于所有 Gogs hook 脚本都依赖bash运行,排查从这一点开始。
先理解一下机制:从 CLI 参考 和源码 cmd/gogs/hook.go 可以看到,仓库里的 pre-receive / update / post-receive hook 本质上会把处理委托给gogs hook子命令,hook命令由 SSH 和 Git 子系统内部调用。所以这个报错只涉及两类条件:脚本能否被解释器执行(需要bash)、以及 hook 里引用的 Gogs 路径是否仍然有效。
检查一:服务器上是否有可用的 bash
这是排查文档针对hook declined列出的首选原因与解决方案:
- 可能原因:Git 无法执行 update hook 脚本;
- 解决方案:确保系统上有可用的
bashshell,所有 Gogs hook 脚本都需要bash才能运行。
在运行 Gogs 的服务器上确认 SSH 会话的执行环境里能够找到bash。如果系统里没有安装bash(或它不在 hook 执行环境可用的位置),需要先安装并使其可用,再重新执行同一次 push。这一步不需要修改 Gogs 的任何配置,也不需要重启服务——hook 脚本是每次 push 时现场执行的。
检查二:Gogs 二进制被移动过,hook 引用了旧路径
如果bash确认可用,问题仍然存在,检查你是否把 Gogs 二进制文件移动到了与原安装位置不同的地方。排查文档中"Incorrect binary path for update hook"条目指出:移动二进制后,仓库内的 Git hooks 会继续引用旧路径,导致脚本失效。
文档给出的解决方案是在管理面板(/admin)中运行以下两个任务:
- Rewrite
.ssh/authorized_keysfile - Resync pre-receive, update and post-receive hooks of all repositories
第二个任务对应的命令行入口(见 CLI 参考):
gogs admin resync-hooks该命令会重新为所有仓库写入 Git 服务端 hooks。所有gogs命令都接受--config(-c)参数指定自定义配置文件路径,默认是custom/conf/app.ini;如果你的实例配置不在默认位置,需要显式带上,例如gogs admin resync-hooks -c /path/to/app.ini(/path/to/app.ini替换为你的实际配置路径)。
注意:按排查文档的方案同时执行第 1 个任务(重写authorized_keys)时,CLI 参考中有一个明确警告——rewrite-authorized-keys会整体替换authorized_keys文件,其中非 Gogs 添加的密钥会丢失。执行前确认该文件中没有你依赖的第三方密钥,或只执行与 hook 相关的第 2 个任务。
验证结果
resync-hooks执行成功时,输出为:All repositories' pre-receive, update and post-receive hooks have been resynced successfully回到客户端重新执行原来的 push:不再出现
(hook declined)拒绝,引用正常更新,即为恢复。
相关但不同的症状
同一份排查文档还有两条容易混淆、但不要按 hook declined 处理的条目:
- push 成功但 dashboard 时间线不更新:多见于仓库存放在挂载设备上,hook 脚本因挂载点设为
noexec而无法执行。文档建议用mount检查挂载选项,必要时在/etc/fstab中为该挂载点加上exec选项;vfat(以及可能的cifs)挂载还需确认uid、gid、fmask选项允许 Gogs 用户执行文件。 - SSH push 挂起 60 秒:Gogs 在每次 SSH push 后会向自己的 Web 服务发回一次 HTTP 请求,若服务器防火墙或网络策略阻断了这条回环连接,请求会一直挂起直到超时。需要确认服务器能在配置的 HTTP 端口访问到自身。
这两条现象的判断和修复都直接以上述文档原文为准,参见 docs/asking/troubleshooting.mdx。
【免费下载链接】gogsThe painless way to host your own Git service项目地址: https://gitcode.com/GitHub_Trending/go/gogs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考