Git私有仓库存储建站代码与中转脚本
很多新手建站时习惯在服务器上直接改代码,时间一长就分不清本地和服务器哪个是最新版本。
更糟的是换服务器或重装系统时,代码就丢了。
用Git私有仓库存储建站代码,配合一条中转脚本,就能让代码从本地推送到仓库,仓库再自动同步到服务器——安全、可追溯、省力气。
本文面向完全没有Git经验的用户,从零开始搭建完整流程。
准备条件:你需要哪几样东西
- 一台你拥有root权限的服务器(演示以CentOS 7+为例)
- 一台你日常使用的电脑(Windows、macOS或Linux均可)
- 一个Git私有仓库系统(本文用轻量的Gitea,你也可以用GitHub免费私有库或自建GitLab)
- 基本的命令行操作能力(跟着本文输入命令就行)
注意: 如果不想自建仓库,直接用GitHub或码云的私有仓库也完全可以,只需跳过下面的Gitea安装步骤,后续的中转脚本配置逻辑相同。
第一步:搭建Git私有仓库(以Gitea为例)
- 在服务器上安装Gitea。SSH登录后依次执行:
sudo yum install -y wget git
wget -O gitea https://dl.gitea.com/gitea/1.21.5/gitea-1.21.5-linux-amd64
chmod +x gitea
./gitea web
首次运行会自动监听3000端口。
用 http://服务器IP:3000 访问安装页面,按提示填入管理员信息(不需要数据库,使用默认SQLite即可)。
- 创建私有仓库。登录Gitea后台,点击「+」→「新建仓库」,仓库名称填入
website,勾选「私有」(Private),创建完成。
第二步:初始化本地项目并推送到私有仓库
在本地电脑上,你已经有一个建站项目文件夹(比如 myblog)。
打开终端进入该目录,执行:
cd myblog
git init
git add .
git commit -m "first commit"
git remote add origin http://服务器IP:3000/你的用户名/website.git
git push -u origin master
推送时会提示输入Gitea的用户名和密码。
成功后在Gitea仓库页就能看到代码了。
第三步:编写中转脚本实现自动部署到服务器
中转脚本的核心是Git的post-receive钩子。
当代码推送到仓库后,仓库会触发这个脚本,脚本将最新代码检出到服务器上的目标目录(比如 /var/www/html)。
- SSH登录服务器,找到Gitea仓库的目录(默认为
~/gitea-repositories/你的用户名/website.git/)。实际路径取决于你运行Gitea的用户和安装目录,这里假设路径为/home/git/gitea-repositories/用户名/website.git。 - 进入该仓库的hooks目录:
cd /home/git/gitea-repositories/用户名/website.git/hooks
- 创建post-receive脚本:
nano post-receive
粘贴以下内容(路径按你的实际情况修改):
#!/bin/bash
TARGET=/var/www/html
GIT_DIR=/home/git/gitea-repositories/用户名/website.git
BRANCH=master
while read oldrev newrev ref
do
if [ "$ref" = "refs/heads/$BRANCH" ]; then
echo "Deploying $BRANCH to $TARGET..."
git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f $BRANCH
fi
done
注意: 第一行 #!
/bin/bash 必须准确,否则脚本不会执行。
- 赋予执行权限:
chmod +x post-receive
- 确保目标目录存在且Gitea运行用户(通常是git)有写入权限:
sudo mkdir -p /var/www/html
sudo chown -R git:git /var/www/html
避坑指南:新手最容易出问题的地方
- SSH用户权限:如果Gitea是以普通用户运行的,那么在hooks里执行的git命令也必须由该用户执行。本文使用git用户,注意普通情况下服务器上可能没有git用户,你需要创建或修改Gitea的运行用户。最简单方式:使用root权限安装Gitea并以root运行,但安全性差。建议用常规方法(如Systemd服务指定User=git)。
- 路径写死:脚本中的GIT_DIR和TARGET路径一定要和实际一致,大小写敏感。
- 防火墙:Gitea监听3000端口,需在服务器防火墙放行。
- 钩子不触发:检查post-receive是否有执行权限,且第一行shebang是否正确。
- 中文文件乱码:Git配置文件设置
[core] quotepath = false。
效果验证与常见问题
验证方法: 在本地的 myblog 目录中修改一个文件(比如加一行文字),然后 git add . && git commit -m "test" && git push。
稍等几秒,查看服务器上的 /var/www/html 目录,应该已经同步更新了。
常见问题:
Q:推送时报错“remote: hooks/post-receive: 权限不够”?
A:确认post-receive有可执行权限:chmod +x post-receive。
Q:推送后服务器目录没有任何变化?
A:检查目标目录的权限,以及Gitea运行用户是否有写入权限。可以在post-receive脚本第一行加 set -x 开启调试,然后重新推送,看输出的日志。
Q:我的仓库是GitHub或码云,怎么实现自动部署?
A:在GitHub上使用Webhook,让GitHub在收到推送时向服务器发送请求,服务器上运行一个监听服务(如Node.js脚本)来拉取代码。或者使用GitHub Actions一键部署。具体可参考我的另一篇文章《GitHub Webhook实现服务器自动部署》。
如果你正在处理Git私有仓库存储建站代码与中转脚本,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
用上这套流程之后,以后更新网站只需要本地 git push 就够了。