网站部署
如何从 GitHub 上自动拉取代码到服务器
更新于 2026-09-24
通过配置 Webhook 和 Shell 脚本,可以在 Git 有最新提交时,只把指定文件同步到服务器。
当远程 Git 仓库有新提交时,只更新特定文件(例如 dist/ 目录,或 public/index.html),不必每次手工把整个项目传上去。
一、准备条件
- 已有 Git 仓库(GitHub、Gitee 等)
- 宝塔服务器已安装 Git、Node.js,PM2 可选
- 项目已用 git clone 初始化为 Git 仓库
二、创建自动拉取脚本(只同步指定文件)
假设项目路径为 /www/wwwroot/zzf.net.cn,只想把仓库中的 dist/ 更新到这个目录。
1、拉完整仓库到缓存目录
bash
mkdir -p /www/git-temp
cd /www/git-temp
git clone https://github.com/zhenfeng95/mysite.git2、创建部署脚本 /www/deploy/deploy.sh
bash
#!/bin/bash
# 1. 进入临时目录
cd /www/git-temp/mysite || exit
# 2. 拉取最新代码
echo "Pulling latest code from GitHub..."
git reset --hard HEAD
git clean -df
git pull origin main
# 3. 拷贝指定文件(只同步 dist 目录)
cp -r dist/* /www/wwwroot/zzf.net.cn/dist/
echo "Deploy finished at $(date)"保存后赋权:
bash
chmod +x /www/deploy/deploy.sh如果只想更新特定文件(例如 config/ 目录或 index.html),可以在 deploy.sh 里改用下面的命令:
bash
git checkout origin/main -- config/
git checkout origin/main -- index.html三、创建 Webhook 接收服务(Node 示例)
安装依赖:
bash
mkdir -p /www/webhook && cd /www/webhook
npm init -y
npm install express body-parser创建 index.js:
js
const express = require('express')
const bodyParser = require('body-parser')
const { exec } = require('child_process')
const app = express()
app.use(bodyParser.json())
app.post('/webhook', (req, res) => {
console.log('Git 推送事件已接收')
exec('sh /www/deploy/deploy.sh', (err, stdout, stderr) => {
if (err) {
console.error('执行失败', stderr)
return res.status(500).send('error')
}
console.log('部署成功', stdout)
res.send('部署成功')
})
})
app.listen(4000, '0.0.0.0', () => {
console.log('Webhook 服务已运行,端口 4000')
})在阿里云后台安全组的入方向放开 4000 端口,否则 GitHub 或 Gitee 访问不到这个地址。
启动服务(建议用 PM2 保活):
bash
npm install -g pm2
pm2 start index.js --name webhook四、在 GitHub / Gitee 中配置 Webhook
前往仓库设置:
- 找到具体项目,进入 Settings > Webhooks > Add webhook
- Payload URL:http://你的服务器公网 IP:4000/webhook(需要公网能访问)
- Content type:application/json
- Secret:可选,用于校验请求是否来自仓库
- 事件类型:只选 push
- 保存