使用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):
#!/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 列。
将项目 Web 目录所有权设为该用户:chown -R www:www /var/www/html/project。
用大白话操作当前项目的 Git/GitHub——配置 GitHub(装 gh CLI + 登录 + 建仓库)、备份、拉取下载、查询历史、回滚代码、管理分支。当用户用日常语言表达 git 意图时触发(例如"git备份一下""git下载项目""git拉下来""git看看我改了啥""git回退到上一个版本""git新建个分支搞新功能""git合并到主分支""git
【裸仓库目录 /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,观察是否无需人工干预即完成上线。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










