目前网站部署的时候实际上是没有后端,属于纯前端页面,并且没有写后台管理。 因此,如果需要增加新内容,例如博客、日记等,除了直接 SSH 链接服务器进行内容更改,我想到的就是直接通过 git 推送文件到服务器中并自动替换到服务器的项目代码里。
工作原理
- 在服务器端创建一个特殊的 Git 仓库(裸仓库),只包含版本历史,不包含实际的文件。
- 在这个仓库里设置一个 hook(
post-receive脚本)。 - 在本地创建一个仓库,并写代码推送。
- 当执行
git push推送代码到服务器的裸仓库时,服务器收到文件会自动触发那个 hook 脚本。 - 脚本将文件自动替换到运行中的项目根目录里实现自动部署。
WARNING在替换前最好让其自动备份一份,防止数据丢失。
实际操作
服务器配置部分
1. 安装 git
sudo apt updatesudo apt install git -y2. 创建裸仓库和网站目录
我们需要两个目录:一个用来存放 Git 的版本数据(裸仓库),另一个是你的项目文件实际存放的位置(工作目录)。
# 1. 创建用于存放裸仓库的目录sudo mkdir -p /var/repo/my-project.git
# 2. 创建你的网站项目的工作目录sudo mkdir -p /var/www/my-project-
/var/repo/my-project.git:这是裸仓库,我们约定俗成地以.git结尾。 -
/var/www/my-project:这是你希望文件最终部署到的地方,比如 Nginx 或 Apache 的网站根目录。
3. 初始化裸仓库
现在,将刚才创建的目录初始化成一个 Git 裸仓库。
sudo git init --bare /var/repo/my-project.git--bare 参数表示创建一个没有工作副本的仓库。
4. 创建 Git 钩子
这是实现自动部署的核心,创建一个在接收到 push 请求后自动执行的脚本。
- 进入裸仓库的
hooks目录:
cd /var/repo/my-project.git/hooks- 创建一个名为
post-receive的文件:
sudo nano post-receive- 在
nano编辑器中,粘贴以下脚本内容:
#!/bin/sh
# 核心命令:# --work-tree 指向你的网站根目录# --git-dir 指向你的裸仓库目录# -f 参数是强制覆盖,避免冲突# 覆盖后,执行build重新编译git --work-tree=/var/www/my-project --git-dir=/var/repo/my-project.git checkout -f && (cd /www/wwwroot/my-project && pnpm build)请确保上面的 /var/www/my-project 和 /var/repo/my-project.git 路径与你第二步创建的完全一致。
-
保存并退出
nano编辑器 (按Ctrl + X,然后按Y,最后按Enter)。 -
给这个钩子脚本添加可执行权限,否则 Git 无法运行它:
sudo chmod +x post-receive5. 设置目录权限
为了让你本地的 Git 能够通过 SSH 推送上来,你需要确保你登录的用户有权限读写这两个目录。假设你通过用户 shine 登录服务器:
# 将这两个目录的所有权赋予你的用户sudo chown -R shine:shine /var/repo/my-project.gitsudo chown -R shine:shine /var/www/my-project注意:请将 shine:shine 替换成你的 用户名:用户组。
服务器端的配置到此完成!
本地电脑配置部分
现在回到你自己的电脑上,打开你的项目文件夹。
1. 初始化本地仓库
如果你的项目还不是一个 Git 仓库,先进行初始化:
# 进入你的项目文件夹cd /path/to/your-project
git initgit add .git commit -m "Initial commit"2. 添加远程仓库地址
我们需要告诉本地 Git,服务器上的那个裸仓库是一个“远程目的地”。
执行以下命令:
git remote add production ssh://shine@your_server_ip/var/repo/my-project.git命令中的参数:
-
production:这是你给这个远程仓库起的名字,可以叫live、server或者任何你喜欢的名字。 -
shine:登录服务器的用户名。 -
your_server_ip:服务器的公网 IP 地址或域名。 -
/var/repo/my-project.git:服务器上裸仓库的绝对路径。
3. 设置 SSH 密钥免密登录
为了每次 push 时不用输入密码,你应该设置 SSH 密钥。如果已经设置过,可以跳过。
-
本地:执行
ssh-copy-id shine@your_server_ip,它会自动将你的公钥复制到服务器的~/.ssh/authorized_keys文件中(windows 可以使用 git bash 或者可以用手动复制的方式写到authorized_keys文件中)。 -
如果没生成过密钥,先在本地执行
ssh-keygen -t rsa。
开始推送和部署!
一切准备就绪,可以开始尝试推送了。
- 像往常一样修改代码并提交你的更改:
git add .git commit -m "feat: updated the homepage content"- 推送到服务器!
git push production mainproduction是你在第二步中添加的远程仓库名。main是你要推送的本地分支名(也可能是master)。
当你执行 push 命令后,你会看到终端输出信息。如果一切顺利,现在去服务器的 /var/www/my-project 目录下查看,会发现文件已经被更新为刚刚推送的版本了!
常见问题排查
-
Permission denied (权限拒绝):
- 检查服务器上的目录权限 (
chown命令是否正确执行)。 - 检查 SSH 连接是否成功,SSH 密钥是否配置正确。
- 检查服务器上的目录权限 (
-
推送后文件没有变化:
- 检查钩子脚本
post-receive是否有可执行权限 (chmod +x)。 - 检查钩子脚本中的
--work-tree和--git-dir路径是否写错了。 - 在服务器上手动执行钩子里的命令
git --work-tree=... checkout -f看看是否报错。
- 检查钩子脚本
-
remote: command not found- 服务器上的 Git 可能没有安装在标准路径下,导致 SSH 会话找不到
git命令。
- 服务器上的 Git 可能没有安装在标准路径下,导致 SSH 会话找不到