Gogs 二进制移动到新目录后 Git hooks 引用失效路径如何修复
【免费下载链接】gogsThe painless way to host your own Git service项目地址: https://gitcode.com/GitHub_Trending/go/gogs
当你把 Gogs 的二进制文件从原安装位置移动到新目录(例如整理目录结构、迁移磁盘)之后,已经写入各仓库的 Git 服务端 hooks 以及 SSH 入口配置里仍然引用旧路径。这些引用指向一个已不存在的位置,导致 Gogs 无法通过 SSH 正确执行pre-receive、update、post-receivehooks。Gogs 官方文档将这一现象列为 SSH 类常见问题,并给出了明确的修复路径:重新生成.ssh/authorized_keys文件,并重新同步所有仓库的 pre-receive、update 和 post-receive hooks(见 docs/asking/troubleshooting.mdx)。
本文只覆盖这一种情况:二进制被移动后 hooks 引用了失效路径。两种操作方式(管理面板、命令行)二选一即可,不需要同时执行。
前提
- Gogs 实例之前可以正常工作,二进制已被移动到新目录,且新位置的配置(
custom/conf/app.ini相对二进制的位置关系)已调整正确,服务可以正常启动。 - 你拥有管理员账号(走管理面板路径时),或者可以以运行 Gogs 的用户身份执行
gogs命令(走 CLI 路径时)。
方式一:通过管理面板执行修复任务
- 登录 Gogs,进入Admin Panel(
/admin页面)。 - 在任务下拉框中选择并运行Rewrite
.ssh/authorized_keysfile。 - 再选择并运行Resync pre-receive, update and post-receive hooks of all repositories。
这两个操作分别对应重新从数据库生成 SSH 密钥文件、重新写入所有仓库的 Git hooks。任务执行完成后,页面会显示对应的成功消息(英文环境下为 "All public keys have been rewritten successfully." 和 "All repositories' pre-receive, update and post-receive hooks have been resynced successfully.")。
注意:重写authorized_keys会用数据库中的公钥整体替换该文件,文件中非 Gogs 写入的密钥会丢失。如果authorized_keys里还有你自己手工添加的其他密钥,执行前先备份。
方式二:通过 CLI 执行(不走 Web 界面)
如果暂时不方便登录 Web 界面(例如正在迁移过程中、服务尚未恢复),可以用gogs二进制自带的 admin 子命令完成同样的维护任务(见 docs/advancing/cli-reference.mdx):
# 重新从数据库生成 .ssh/authorized_keys gogs admin rewrite-authorized-keys # 重新写入所有仓库的 pre-receive、update 和 post-receive hooks gogs admin resync-hooks每条命令都接受--config(-c)参数指定配置文件路径,默认是custom/conf/app.ini。如果你的配置放在其他位置,需要显式带上:
gogs admin rewrite-authorized-keys -c /path/to/your/app.ini gogs admin resync-hooks -c /path/to/your/app.ini其中-c后面替换为你的app.ini实际路径。执行时请在运行 Gogs 的用户下、以新位置的二进制执行。
执行成功时,终端会打印如下消息(引自命令实现的成功提示,见 cmd/gogs/admin.go):
All public keys have been rewritten successfully All repositories' pre-receive, update and post-receive hooks have been resynced successfully如何判断已修复
- 命令行路径以上面的两条成功输出作为完成标志;管理面板路径以页面显示的成功消息为准。
- 之后通过 SSH 向仓库 push 时,hooks 会以新路径被正常调用,不再出现指向旧路径的失败现象。
一个容易混淆的不同问题
如果重写并重新同步 hooks 后,push 仍然被拒绝、报! [remote rejected] master -> master (hook declined),这不是路径失效问题,而是 Git 无法执行 update hook 脚本——该情况的文档结论是确保系统上有bash(所有 Gogs hook 脚本都依赖bash运行)。这是另一条独立的排查路径,不要与本文的移动二进制问题混在一起处理。
相关文档
- 问题背景与面板操作步骤:docs/asking/troubleshooting.mdx(SSH 一节 "Incorrect binary path for update hook")
- CLI 维护命令参考:docs/advancing/cli-reference.mdx
【免费下载链接】gogsThe painless way to host your own Git service项目地址: https://gitcode.com/GitHub_Trending/go/gogs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考