git自动部署需手动配置bare仓库和钩子,或用宝塔计划任务定时拉取;关键在权限(chown www:www)、路径(绝对路径调用git)、环境(显式指定/bin/bash)及webhook的nginx配置与ip限制。

Git Hook 配合宝塔计划任务能跑通,但别直接用 post-receive
宝塔面板本身不内置 Git 服务器,所谓“自动部署”其实是靠你在服务器上手动搭 bare 仓库 + 触发钩子脚本,再由宝塔的计划任务兜底轮询或监听。直接在宝塔 Web 界面点“Git 部署”按钮,它只支持单次拉取,不是真自动——post-receive 钩子必须手动配置且权限极易出错。
- 常见错误现象:
remote: fatal: unable to fork或钩子静默失败,多半是钩子文件没chmod +x,或用了sudo权限但 SSH 环境变量缺失 - 正确做法:钩子脚本里显式声明
/bin/bash解释器,用绝对路径调用git(如/usr/bin/git),避免依赖用户 shell 配置 - 关键兼容点:宝塔默认用
www用户运行网站,但 Git 钩子常以root或你的登录用户执行,导致写入www目录权限拒绝——务必在钩子里用chown -R www:www /www/wwwroot/your-site
用宝塔计划任务替代钩子更稳,尤其适合私有 GitLab / Gitee
如果你代码托管在 Gitee、GitLab 私有库或 GitHub(配了内网 webhook),与其折腾 SSH 钩子,不如让宝塔定时拉取。计划任务本质是 crontab 封装,可控性高、日志清晰、失败也容易排查。
- 使用场景:代码不频繁更新(比如每天几次)、不想开 SSH 端口、或团队成员没服务器权限
- 实操建议:新建计划任务,类型选“Shell 脚本”,执行周期设为“每5分钟”,命令填:
cd /www/wwwroot/your-site && git pull origin main --ff-only 2>&1
,注意加--ff-only防冲突,输出重定向方便查日志 - 性能影响:每次
git pull只比对 HEAD,网络开销小;但若分支长期不合并,可能因非快进(non-fast-forward)失败——这时得加git reset --hard origin/main,不过要承担丢本地修改的风险
Webhook 触发需绕过宝塔反向代理限制
想用 Gitee 的 Webhook 实时触发部署?宝塔默认的 Nginx 配置会拦截 POST 请求或超时,413 Request Entity Too Large 或 504 Gateway Time-out 是典型表现。
- 必须改的配置项:
client_max_body_size(Nginx)和fastcgi_read_timeout(PHP 项目常用),在宝塔站点设置 → 配置文件里追加:client_max_body_size 10M;<br>fastcgi_read_timeout 300;
- 安全坑:别把 Webhook 地址暴露成公开可访问的 PHP 脚本(如
/webhook.php),Gitee 不支持带 token 的简单校验,建议用宝塔防火墙限制来源 IP 段(如只放行116.255.229.0/24) - 调试技巧:Webhook 发送后立刻看宝塔日志 → 安全 → 日志审计,确认请求是否到达;再查对应站点的 error.log,定位是 Nginx 拦截还是脚本执行异常
上线前必须检查 work tree 权限与 .git 文件残留
自动部署最隐蔽的问题不是拉不下来,而是拉下来后 PHP 读不了、前端静态资源 403、或者下次 git pull 报错 fatal: Not a git repository——大概率是部署目录混进了 .git 子目录或权限错乱。
- 标准清理动作:部署脚本末尾加
find /www/wwwroot/your-site -name ".git" -type d -exec rm -rf {} + 2>/dev/null,防止子模块或误操作污染 - 权限陷阱:宝塔网站根目录属主必须是
www,但git pull若用 root 执行,会把新文件属主变成root,导致 PHP 进程无法读取——统一用su -c "git pull..." -s /bin/bash www切换用户执行 - 环境差异:本地开发用
npm run build生成 dist,服务器自动部署时得在钩子或计划任务里补上这步,否则上线的是未编译源码
Git 自动部署看着是一键的事,实际卡点都在权限、路径、环境变量这三块。尤其是多个项目共用一个服务器时,www 用户的 HOME 目录、PATH 和 SSH key 权限稍不注意就串了。先跑通一个最小闭环(bare 仓库 + 钩子 + chown),再往上加构建、测试、回滚逻辑。










