以前更新网站的工作流:本地改代码 → 打开FileZilla → 找到对应文件 → 上传 → 刷新看效果 → 又改了 → 再上传。改一个CSS颜色能来回上传五六次,一天下来光等FTP传输就浪费半小时。
后来配了Git Hook自动部署,改好代码 git push,服务器自动拉取更新。体验直接上一个档次。
原理很简单:Git仓库有一个hooks目录,里面可以放脚本,在特定事件触发时执行。我们用的是post-receive——服务端收到push后自动执行的钩子。
具体步骤:
1. 在服务器上创建一个裸仓库(bare repo):
git init --bare /var/repo/mysite.git
2. 创建post-receive钩子:
cd /var/repo/mysite.git/hooks
nano post-receive
3. 写入以下脚本:
#!/bin/bash
GIT_DIR=/var/repo/mysite.git
WORK_TREE=/var/www/mysite
while read oldrev newrev ref
do
if [ "$ref" = "refs/heads/main" ]; then
git --work-tree=$WORK_TREE --git-dir=$GIT_DIR checkout -f main
echo "Deployed to $WORK_TREE"
fi
done
4. 给执行权限:chmod +x post-receive
5. 本地添加远程仓库:git remote add production ssh://user@你的服务器IP/var/repo/mysite.git
6. 推送部署:git push production main
之后每次改完代码,git add + git commit + git push production main,服务器自动更新。三秒内网站就变了。
几个注意点:
这个方案适合静态网站和PHP网站——文件直接覆盖就行。Node.js项目需要在post-receive里加npm install和pm2 restart。数据库有变更的话,钩子里跑一遍migration脚本。
安全问题:服务器上的git用户权限要控制好,建议单独建一个deploy用户,只给/var/www/mysite的写权限。
备份问题:建议在post-receive里加一行备份命令——部署前先把当前版本tar打包存到备份目录。万一新版本有问题,一分钟就能回滚。
从FTP到Git Hook,本质上是从「手动上传文件」变成了「自动化流程」。省下来的时间可以多想点产品,少看点进度条。
还木有评论哦,快来抢沙发吧~