1371 字
7 分钟
Git上传至自己服务器的方法

目前网站部署的时候实际上是没有后端,属于纯前端页面,并且没有写后台管理。 因此,如果需要增加新内容,例如博客、日记等,除了直接 SSH 链接服务器进行内容更改,我想到的就是直接通过 git 推送文件到服务器中并自动替换到服务器的项目代码里。

工作原理#

  1. 在服务器端创建一个特殊的 Git 仓库(裸仓库),只包含版本历史,不包含实际的文件。
  2. 在这个仓库里设置一个 hook(post-receive脚本)。
  3. 在本地创建一个仓库,并写代码推送。
  4. 当执行git push推送代码到服务器的裸仓库时,服务器收到文件会自动触发那个 hook 脚本。
  5. 脚本将文件自动替换到运行中的项目根目录里实现自动部署。
WARNING

在替换前最好让其自动备份一份,防止数据丢失。

实际操作#

服务器配置部分#

1. 安装 git#

Terminal window
sudo apt update
sudo apt install git -y

2. 创建裸仓库和网站目录#

我们需要两个目录:一个用来存放 Git 的版本数据(裸仓库),另一个是你的项目文件实际存放的位置(工作目录)。

Terminal window
# 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 裸仓库。

Terminal window
sudo git init --bare /var/repo/my-project.git

--bare 参数表示创建一个没有工作副本的仓库。

4. 创建 Git 钩子#

这是实现自动部署的核心,创建一个在接收到 push 请求后自动执行的脚本。

  1. 进入裸仓库的 hooks 目录:
Terminal window
cd /var/repo/my-project.git/hooks
  1. 创建一个名为 post-receive 的文件:
Terminal window
sudo nano post-receive
  1. 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 路径与你第二步创建的完全一致。

  1. 保存并退出 nano 编辑器 (按 Ctrl + X,然后按 Y,最后按 Enter)。

  2. 给这个钩子脚本添加可执行权限,否则 Git 无法运行它:

Terminal window
sudo chmod +x post-receive

5. 设置目录权限#

为了让你本地的 Git 能够通过 SSH 推送上来,你需要确保你登录的用户有权限读写这两个目录。假设你通过用户 shine 登录服务器:

Terminal window
# 将这两个目录的所有权赋予你的用户
sudo chown -R shine:shine /var/repo/my-project.git
sudo chown -R shine:shine /var/www/my-project

注意:请将 shine:shine 替换成你的 用户名:用户组

服务器端的配置到此完成!


本地电脑配置部分#

现在回到你自己的电脑上,打开你的项目文件夹。

1. 初始化本地仓库#

如果你的项目还不是一个 Git 仓库,先进行初始化:

Terminal window
# 进入你的项目文件夹
cd /path/to/your-project
git init
git add .
git commit -m "Initial commit"

2. 添加远程仓库地址#

我们需要告诉本地 Git,服务器上的那个裸仓库是一个“远程目的地”。

执行以下命令:

Terminal window
git remote add production ssh://shine@your_server_ip/var/repo/my-project.git

命令中的参数

  • production:这是你给这个远程仓库起的名字,可以叫 liveserver 或者任何你喜欢的名字。

  • 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


开始推送和部署!#

一切准备就绪,可以开始尝试推送了。

  1. 像往常一样修改代码并提交你的更改:
Terminal window
git add .
git commit -m "feat: updated the homepage content"
  1. 推送到服务器!
Terminal window
git push production main
  • production 是你在第二步中添加的远程仓库名。
  • 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上传至自己服务器的方法
http://www.shineacz.top/posts/git上传至自己服务器的方法/
作者
shineAcZ
发布于
2025-09-06
许可协议
CC BY 4.0