You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派Gogs仓库:post-receive钩子+lftp上传PHP文件遇文件定位问题

解决Gogs post-receive钩子+FTP同步的问题

首先你看到的那些哈希命名的文件是Git的对象存储文件,属于裸仓库的核心结构,完全不是你要找的钩子相关文件,别慌,咱们一步步搞定:

1. 定位正确的钩子目录

Gogs的每个仓库都是裸仓库(没有本地工作目录的Git仓库),默认存储路径一般是:

/home/git/gogs-repositories/你的用户名/你的仓库名.git/hooks/

进入这个目录后,你会看到一堆带.sample后缀的钩子模板文件,比如post-receive.sample——这就是我们要改造的目标文件。

2. 创建可执行的post-receive钩子

先把模板复制一份并去掉.sample后缀(Git只会执行没有后缀的钩子文件):

cd /home/git/gogs-repositories/你的用户名/你的仓库名.git/hooks/
cp post-receive.sample post-receive
chmod +x post-receive

chmod +x是给脚本加上可执行权限,这一步很关键,不然Git触发不了钩子。

3. 编写钩子脚本(用lftp同步到FTP服务器)

用编辑器打开post-receive文件,替换里面的示例内容为以下shell脚本逻辑:

首先得先给裸仓库准备一个临时工作目录(因为裸仓库没有可直接上传的文件):

mkdir -p /tmp/gogs-deploy/你的仓库名

然后在钩子脚本里写入:

#!/bin/bash

# 配置同步参数,替换成你的实际信息
LOCAL_WORK_DIR="/tmp/gogs-deploy/你的仓库名"
FTP_HOST="你的FTP服务器地址"
FTP_USER="你的FTP用户名"
FTP_PASS="你的FTP密码"
FTP_TARGET_DIR="/远程服务器的目标目录"

# 把裸仓库的最新代码检出到本地工作目录
git --work-tree=$LOCAL_WORK_DIR checkout -f

# 用lftp同步本地目录到FTP服务器
lftp -u $FTP_USER,$FTP_PASS $FTP_HOST << EOF
mirror -R --delete $LOCAL_WORK_DIR $FTP_TARGET_DIR
bye
EOF

脚本说明:

  • git --work-tree=$LOCAL_WORK_DIR checkout -f:强制将裸仓库的最新代码检出到指定的本地工作目录
  • lftp的mirror -R --delete:-R表示反向同步(本地→远程),--delete会删除远程服务器上本地已不存在的文件,保证两端文件完全一致

4. 权限配置(必做!)

因为Gogs是用git用户运行的,所以要确保:

  • git用户对工作目录/tmp/gogs-deploy/你的仓库名有读写权限
  • 已经安装lftp工具(没装的话执行:sudo apt install lftp)

5. 测试钩子

现在你在本地提交代码并推送到Gogs仓库,钩子会自动触发,用lftp把同步后的代码上传到FTP服务器。如果遇到问题,可以查看Gogs的日志(默认路径/home/git/gogs/log),或者在钩子脚本里添加日志输出语句来排查问题。


内容的提问来源于stack exchange,提问作者Thombou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:23:17