树莓派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
相关产品推荐
相关产品推荐

