git hook 能在服务器自动拉代码,但需裸仓库+钩子+检出目录组合,用 git --work-tree 和 --git-dir 指定路径并确保 web 用户有写权限。

Git Hook 能不能直接在服务器上自动拉代码
不能直接靠 git pull 在生产环境裸仓库里运行,因为服务器上的工作目录默认不带 Git 环境(没 .git 目录),或者权限不对、分支没检出、钩子没启用。
常见错误现象:fatal: not a git repository (or any of the parent directories) 或者拉完代码但网页没更新——其实是文件没真正写到 Web 根目录。
- 必须用「裸仓库 + 钩子 + 检出目录」组合:先建一个
/var/repo/your-app.git(裸库),再指定一个分离的/var/www/your-app作为 Web 可访问目录 - 钩子脚本里得用
git --work-tree=/var/www/your-app --git-dir=/var/repo/your-app.git checkout -f,否则只是更新了裸库,没动网站文件 - 确保 Web 用户(如
www-data)对/var/www/your-app有写权限,否则钩子执行会静默失败
ThinkPHP 缓存和 runtime 目录为什么每次同步后报错
因为 runtime 目录里的缓存、日志、模板编译文件是运行时生成的,Git 不该提交,但本地开发时可能误提交了部分文件,或服务器上残留旧缓存导致框架初始化失败。
典型表现:file_put_contents(/var/www/your-app/runtime/cache/...): failed to open stream 或白屏无错误。
- 本地
.gitignore必须包含:runtime/、public/static/(如果前端资源由构建生成)、.env - 服务器部署钩子里加一句
rm -rf /var/www/your-app/runtime/*,但别删空目录本身(ThinkPHP 启动时需要它存在) - 如果用了
php think optimize:config等命令生成静态配置,这些要进 Git;但生成结果不能依赖本地路径,否则上线后路径错乱
怎么让 .env 文件不被 Git 提交又能在服务器生效
本地开发用 .env 配置数据库、调试开关等,但绝不能提交到仓库——否则密码泄露、测试配置污染生产环境。
批量替换指定目录下所有 Git 仓库的远程地址(remote URL)。 当用户需要将 Git 仓库从一个服务器迁移到另一个服务器时使用。 触发词:git remote 替换、git url 批量修改、git 仓库迁移、更换 git 地址、批量修改 remote url。
直接复制 .env 到服务器是最常见也最危险的做法,一旦忘记改数据库地址,立刻连错库。
- 本地
.gitignore加.env,同时保留.env.example(只含键名和注释,不含值)供新成员参考 - 服务器上手动创建
/var/www/your-app/.env,内容仅含线上配置,且权限设为600(chmod 600 .env) - ThinkPHP 5.1+ 默认读
.env,无需额外加载;但确认APP_DEBUG=false已生效,否则错误信息会暴露路径
Webhook 和 SSH 部署哪个更安全可靠
纯 Webhook(比如 GitHub/GitLab 推送触发 HTTP 请求)在没加签名验证时极不安全——攻击者伪造请求就能执行任意部署脚本。SSH 方式虽然要配密钥,但可控性高得多。
错误做法:把 Webhook 地址写死在公网可访问的 PHP 脚本里,还用 exec('git pull') 执行。
- Webhook 必须校验
X-Hub-Signature-256(GitHub)或X-Gitlab-Token(GitLab),否则拒收 - 推荐用 SSH + 免密登录 + 专用部署用户(如
deploy),本地git push到服务器裸库,由钩子完成后续动作 - 避免在钩子里执行
composer install—— ThinkPHP 项目一般已打包好依赖,真要装也得用--no-dev --optimize-autoloader,否则拖慢部署还可能失败
最易被忽略的一点:所有钩子脚本开头加 set -e,任何命令失败就终止,不然 checkout 失败了后面还在清缓存,结果站点直接不可用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










