You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用纯Git部署Laravel生产站点及相关更新问题咨询

纯Git部署Laravel站点的疑问

环境配置

  • 本地:Herd + PhpStorm
  • 远程服务器:拥有SSH访问权限

已完成的操作

  1. 本地PhpStorm创建Git仓库并完成初始提交
  2. PhpStorm添加远程服务器
  3. 远程服务器创建空文件夹site.git,执行git init --bare初始化裸仓库
  4. 本地将master分支推送到远程裸仓库
  5. 远程服务器创建site文件夹,执行git clone ~/site.git .拉取文件(.gitignore排除的文件除外)
  6. 远程执行部署命令:
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钩子就能实现自动部署,步骤如下:

  1. 登录远程服务器,进入site.git/hooks目录
  2. 创建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
  1. 给钩子文件添加执行权限: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时无冲突,完全同步本地仓库内容?

可以,常用两种方式:

  1. 标记文件为忽略修改:对服务器上的动态文件执行git update-index --assume-unchanged path/to/file,Git会忽略该文件的本地修改。但注意:如果本地仓库修改了该文件并推送,服务器版本会被覆盖,适合日志这类无需同步的文件。
  2. 强制重置+清理:每次更新前执行git fetch origin && git reset --hard origin/master && git clean -fd,git clean -fd会删除所有未追踪的文件和目录,确保完全同步远程分支。但要提前备份服务器上的重要动态文件,或把它们移出Git跟踪目录,否则会被删除。

最稳妥的方案还是把服务器生成的动态文件移出Git跟踪目录,或添加到.gitignore,从根源解决冲突问题。


内容的提问来源于stack exchange,提问作者irrbloss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:52:39