用 Git 做自动部署:push 即上线
发布时间:2026-01-26 14:06       
更新时间:2026-01-26 16:23
每次改完代码靠 FTP(文件传输)手动上传,误传和漏传是迟早的事。用 Git 的钩子做自动部署,本地 git push 完,服务器上的网站就已经更新,配置只要五分钟。
一、思路
服务器上建一个裸仓库——只存版本历史、没有工作文件的仓库,再指定一个发布目录。代码 push 进来时,post-receive 钩子(收到推送后自动执行的脚本)把最新代码检出到发布目录,网页服务器指向那里。版本库与发布目录分离,避免了直接在网站目录里改文件的混乱。裸仓库只当中转,工作目录随时可以删掉重新检出,不心疼。
二、建裸仓库
git init --bare /home/deploy/site.git
三、写钩子
cd /home/deploy/site.git/hooks 创建 post-receive 文件:
#!/bin/bash
git --work-tree=/var/www/site --git-dir=/home/deploy/site.git checkout -f
echo "deployed at $(date)"
chmod +x post-receive 赋予执行权限,发布目录提前建好并保证 push 用户有写权限。脚本里的三处路径按服务器实际目录替换。
四、本地使用
把服务器仓库加为远程:
git remote add deploy deploy@192.0.2.10:/home/deploy/site.git
以后上线就是两步:git commit 提交改动,git push deploy main 推送。push 输出里看到 deployed 字样,刷新网页就是新版本,全程不用登录服务器。第一次 push 前先确认免密登录已配好,否则推送会卡在密码提示上。
五、几点注意
数据库配置文件不入库,用 .gitignore 排除,在服务器上单独维护。需要构建的前端项目,在钩子里追加构建命令,把产物输出到发布目录。发布出问题回退也简单:本地 git revert 后再 push 一次,或让钩子检出上一个版本号,回退流程值得提前演练一次。钩子脚本有语法错误时 push 会报错但代码已入库,手动执行一次 checkout 就能补救。多人协作时钩子以各自账号运行,发布目录权限要提前统一。
这套流程的适用边界是单机小项目;多服务器发布、灰度切换,应该交给专业的持续集成工具。先让 push 即上线稳定跑起来,再谈更复杂的发布体系。