使用post-receive钩子实现PHP项目自动部署:在裸仓库hooks目录创建可执行脚本,指定TARGET、GIT_DIR和BRANCH,通过git checkout -f自动检出代码,并确保www用户对仓库及Web目录具有读写权限。

你需要在代码推送到远程仓库后,服务器自动更新PHP项目文件,避免每次手动执行 git pull,防止因遗漏导致线上环境与代码库不一致。
配置服务器端 post-receive 钩子
登录部署服务器,进入裸仓库的 hooks 目录:【必须是裸仓库(.git 结尾)】,路径通常为 /var/repo/your-project.git/hooks。
用 nano 创建或编辑 post-receive 文件:nano /var/repo/your-project.git/hooks/post-receive。
粘贴以下脚本,注意替换 TARGET(Web 根目录)、GIT_DIR(裸仓库路径)、BRANCH(如 main 或 master):
立即学习“PHP免费学习笔记(深入)”;
#!/bin/bash<br>TARGET="/var/www/html/project"<br>GIT_DIR="/var/repo/your-project.git"<br>BRANCH="main"<br><br>while read oldrev newrev ref; do<br> if [[ $ref = refs/heads/$BRANCH ]]; then<br> echo "Deploying $BRANCH to $TARGET"<br> git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f $BRANCH<br> chown -R www:www $TARGET<br> fi<br>done
保存后执行 chmod +x post-receive,赋予可执行权限。这一步漏掉会导致钩子完全不触发。
确保 Web 目录权限与用户匹配
PHP 进程和 Git 操作必须由同一系统用户执行,常见为 www 或 nginx 用户。
确认当前 Web 服务运行用户:ps aux | grep -E '(nginx|apache|php-fpm)',观察 USER 列。
Git post-commit 钩子 + SQLite 提交索引工具。自动将每次提交的元数据(哈希值、作者、分支、仓库、主题)记录到本地 SQLite 数据库中,随后提供一个命令行接口(CLI),支持查询、列表展示、统计、删除和更新记录。 触发场景:管理 Git 钩子、跨仓库查询提交历史、定位某次提交所属的仓库、查看提交统计信息、将提交记录写入本地索引。 当用户提及“提交日志记录”、“提交索引”、“跨仓库查找提交”、“Git 钩子管理”,或希望以结构化方式查询其提交历史时(即使未明确指出该工具),请使
将项目 Web 目录所有权设为该用户:chown -R www:www /var/www/html/project。
【裸仓库目录 /var/repo/your-project.git 也必须属 www 用户】,否则 post-receive 脚本无权读取 Git 对象。
若裸仓库属 root,执行:chown -R www:www /var/repo/your-project.git。
验证并启用自动部署流程
第一步:本地推送一次测试分支:git push origin main。
第二步:立刻检查服务器 Web 目录文件是否更新,同时查看终端输出是否有 “Deploying main to …” 日志。
第三步:若失败,直接执行钩子脚本调试:sudo -u www bash /var/repo/your-project.git/hooks/post-receive,观察报错信息。
第四步:确认 Web 服务器能正常访问更新后的 PHP 页面,特别是 autoload、.env 等敏感文件是否被正确覆盖。
第五步:在远程仓库推送一个带新功能的 commit,观察是否无需人工干预即完成上线。


















