news 2026/9/10 15:39:30

Gogs 二进制移动到新目录后 Git hooks 引用失效路径如何修复

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Gogs 二进制移动到新目录后 Git hooks 引用失效路径如何修复

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-receiveupdatepost-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 路径时)。

方式一:通过管理面板执行修复任务

  1. 登录 Gogs,进入Admin Panel/admin页面)。
  2. 在任务下拉框中选择并运行Rewrite.ssh/authorized_keysfile
  3. 再选择并运行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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 15:35:46

如何用 dart_roll_helper.py 把新的 Dart SDK 版本 roll 进 Flutter 引擎

如何用 dart_roll_helper.py 把新的 Dart SDK 版本 roll 进 Flutter 引擎 【免费下载链接】flutter Flutter makes it easy and fast to build beautiful apps for mobile and beyond 项目地址: https://gitcode.com/GitHub_Trending/flutter41/flutter Flutter 仓库通过…

作者头像 李华