Gogs push 成功但仪表盘 timeline 不更新怎么排查
【免费下载链接】gogsThe painless way to host your own Git service项目地址: https://gitcode.com/GitHub_Trending/go/gogs
通过 SSH 向 Gogs 推送代码时,客户端显示 push 成功,但登录 Gogs 后首页仪表盘的 timeline(动态)和仓库页面的提交信息始终不刷新。这个问题与网络或数据库连接失败不同:push 本身已经完成了,卡在 Gogs 收到推送后的后续动作上。本文给出 Gogs 官方文档 Troubleshooting 中针对这一现象的排查路径:先确认 hook 脚本是否真正执行,再按仓库所在存储的挂载方式逐项检查,最后在 hook 路径过期时重建 hook。
先理解机制:timeline 由 hook 脚本更新
按 Gogs 文档的说明,当使用 Git over SSH 时,Gogs 依赖 hook 脚本来更新 timeline 和仓库展示信息。也就是说,SSH push 成功只代表 Git 数据已写入仓库,timeline 的更新是 post-receive hook 脚本执行后才会发生的动作。
docs/asking/troubleshooting.mdx 同时指出:若干条件会导致这些 hook 脚本无法执行,尤其是仓库存放在挂载设备(mounted device)上时。因此排查的主线是:确认脚本能不能被执行,而不能只盯着 push 命令本身。
第一步:确认 hook 是否真的被执行
在 push 的客户端输出中先看有没有 hook 报错。文档记录了一种相关现象:当系统缺少bash时(Gogs 的所有 hook 脚本都依赖bash运行),push 会收到如下拒绝信息:
! [remote rejected] master -> master (hook declined)如果你看到的是这条报错,先确认服务器上bash可用即可,不必再往下查挂载点。
如果 push 输出完全正常、没有 hook 报错,说明问题更可能是 hook 脚本因文件系统限制被静默阻止执行,进入第二步。
第二步:检查仓库所在挂载点的执行权限
这是文档列出的最主要根因。在 Gogs 服务器上运行mount查看仓库所在挂载点的当前挂载选项,然后按以下三种情况分别处理(三种情况都来自 docs/asking/troubleshooting.mdx 的原文方案):
挂载点带有noexec
如果mount输出显示包含仓库的挂载点设置了noexec,hook 脚本无法执行。需要在/etc/fstab中为该挂载点添加exec选项,然后重新挂载使其生效。修改/etc/fstab前建议先备份原文件。
vfat(以及可能的 cifs)挂载
如果仓库位于vfat文件系统上(cifs 也可能出现同类问题),需要确认uid、gid和fmask挂载选项允许运行 Gogs 的用户(或其所属组)执行文件。
NFS、Samba 网络共享
如果仓库通过网络挂载的共享(NFS、Samba)存放,需要确认服务器端没有配置为禁止在远端文件系统中执行文件。
第三步:hook 路径过期时重建 hook
另一种会导致 hook 失效的情况是:Gogs 二进制被移动到了与原安装位置不同的目录,导致 Git hooks 引用了过期的路径。文档给出的处理方式是登录管理面板(/admin)依次执行两个任务:
- Rewrite
.ssh/authorized_keysfile - Resync pre-receive, update and post-receive hooks of all repositories
也可以通过命令行完成 hook 重建,resync-hooks子命令会为所有仓库重新写入 Git server-side hooks(参见 CLI reference):
gogs admin resync-hooks注意:该命令作用于所有仓库,会重写它们的服务端 hooks,应在 Gogs 停止或业务低峰期执行。管理面板中的 "Rewrite.ssh/authorized_keysfile" 任务会整体替换authorized_keys文件,文件里非 Gogs 添加的 key 会丢失,执行前请先备份。
验证修复是否生效
timeline 不更新的排查没有独立的诊断命令,验证方式就是复现原始场景:通过 SSH 向任一仓库 push 一次新的提交,然后刷新 Gogs 首页查看仪表盘 timeline 是否出现对应的 push 记录。如果 timeline 恢复更新,说明 hook 已能正常执行;仍然不更新时,回到第二步核对mount的实际输出与/etc/fstab是否一致( fstab 修改后未重新挂载是常见遗漏)。
适用范围与限制
- 本文只覆盖Git over SSH推送导致的 timeline 不更新,这是该现象在文档中的适用前提;
- 文档将该问题与挂载设备场景强关联,本地磁盘直存的部署可优先跳到第三步检查 hook 路径;
- 排查中涉及的命令(
mount、gogs admin resync-hooks)均要求对 Gogs 服务器有 shell 访问权限。
【免费下载链接】gogsThe painless way to host your own Git service项目地址: https://gitcode.com/GitHub_Trending/go/gogs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考