使用纯Git部署Laravel生产站点及相关更新问题咨询
纯Git部署Laravel站点的疑问
环境配置
- 本地:Herd + PhpStorm
- 远程服务器:拥有SSH访问权限
已完成的操作
- 本地PhpStorm创建Git仓库并完成初始提交
- PhpStorm添加远程服务器
- 远程服务器创建空文件夹
site.git,执行git init --bare初始化裸仓库 - 本地将master分支推送到远程裸仓库
- 远程服务器创建
site文件夹,执行git clone ~/site.git .拉取文件(.gitignore排除的文件除外) - 远程执行部署命令:
composer install --optimize-autoloader --no-dev php artisan key:generate php artisan config:cache php artisan route:cache chmod -R 775 storage chmod -R 775 bootstrap/cache
同时在执行config:cache前添加了包含正确邮件/数据库配置的.env文件
当前站点已正常运行,但更新时推送到远程后,在site目录执行git pull会因为服务器生成的用户上传文件、日志等未加入.gitignore的文件引发冲突,需要调整Git设置。
问题解答
1. 这是否是使用Git部署/更新生产站点的规范方式?
属于基础规范的简化版,适合小型项目或个人开发场景,但生产环境下还可以补充优化点:
- 建议使用专门的部署分支(比如
main替代master,或单独的deploy分支),避免直接推送生产分支 - 服务器上的动态文件(用户上传、日志)最好和代码目录分离,比如把
storage/app/public挂载到独立存储目录或用对象存储,从根源避免Git冲突 - 每次部署添加版本标记,方便快速回滚
2. 能否在远程服务器添加钩子,实现推送后自动执行git pull(或合适命令)?
完全可以,用裸仓库的post-receive钩子就能实现自动部署,步骤如下:
- 登录远程服务器,进入
site.git/hooks目录 - 创建
post-receive文件(无后缀),写入以下内容:
#!/bin/bash TARGET="/path/to/your/site" GIT_DIR="/path/to/your/site.git" BRANCH="master" while read oldrev newrev ref do # 仅处理指定分支的推送 if [[ $ref = refs/heads/$BRANCH ]]; then echo "Deploying $BRANCH branch to production..." git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f $BRANCH # 可选:执行部署后的必要操作 cd $TARGET php artisan config:cache php artisan route:cache # 仅当composer.lock有更新时执行依赖安装 # git diff --name-only $oldrev $newrev | grep -q composer.lock && composer install --optimize-autoloader --no-dev fi done
- 给钩子文件添加执行权限:
chmod +x post-receive
之后每次本地推送到裸仓库,钩子会自动同步代码到site目录,无需手动执行pull。
3. git pull是否为正确命令?是否应使用git fetch?是否需要在每次pull前执行git reset --hard?
git pull本质是git fetch + git merge,如果服务器目录存在未追踪/修改的文件,merge就会触发冲突,不适合生产环境的自动同步- 更可靠的方式是用
git checkout -f(如上述钩子)或git reset --hard origin/master,这类命令会强制覆盖本地目录,完全对齐远程分支状态 - 生产环境不建议手动用
git pull更新,除非你确认没有未处理的本地修改
4. 能否忽略远程仓库中的本地修改(无需将服务器新增/修改的文件加入.gitignore),确保git pull时无冲突,完全同步本地仓库内容?
可以,常用两种方式:
- 标记文件为忽略修改:对服务器上的动态文件执行
git update-index --assume-unchanged path/to/file,Git会忽略该文件的本地修改。但注意:如果本地仓库修改了该文件并推送,服务器版本会被覆盖,适合日志这类无需同步的文件。 - 强制重置+清理:每次更新前执行
git fetch origin && git reset --hard origin/master && git clean -fd,git clean -fd会删除所有未追踪的文件和目录,确保完全同步远程分支。但要提前备份服务器上的重要动态文件,或把它们移出Git跟踪目录,否则会被删除。
最稳妥的方案还是把服务器生成的动态文件移出Git跟踪目录,或添加到.gitignore,从根源解决冲突问题。
内容的提问来源于stack exchange,提问作者irrbloss
相关产品推荐
相关产品推荐

