站点迁移小记
再也忍受不了PHP博客的种种,遂迁移到静态博客,在艰难选择之下决定使用VuePress+PlumePress主题,顺便记录一下迁移的细节。
思路
网络上有很多VuePress的静态部署教程,但PlumePress主题必须使用git仓库才能启用更新日志, 且国内访问GIthub时常失联,所以采用完全创建裸远程git仓库+自定义post-recieve脚本的方式来实现 git历史记录和部署到自己服务器的需求。
环境 & 准备知识
环境
- 一台公网可达的服务器(带有http服务器)
- 通畅的国际互联网访问(或镜像源)
准备知识
- 什么是Git裸仓库
- 裸仓库目录结构
- Git hooks 脚本
Git 裸仓库(Bare Repository)是一种特殊的 Git 仓库,它不包含工作目录和 .git 文件夹,而是将所有版本控制信息直接存储在仓库的根目录中。裸仓库通常用于服务器端或共享环境中,以便多个开发者可以推送和拉取代码,而不会意外地修改服务器上的文件。
主要特点:
- 没有工作目录: 普通 Git 仓库有一个工作目录,用于存放项目文件,并且有一个隐藏的 .git 目录来存储版本控制元数据。 裸仓库则没有工作目录,所有的 Git 元数据都直接存放在仓库的根目录下。
- 只能通过 Git 命令操作: 由于裸仓库没有工作目录,你不能直接在裸仓库中编辑文件。所有的操作必须通过 Git 命令(如 git push、git pull 等)进行。
- 适用于远程仓库: 裸仓库通常用作远程仓库,供团队成员克隆、推送和拉取代码。常见的托管平台如 GitHub、GitLab 和 Bitbucket 使用的就是裸仓库。
- 多人协作友好:
裸仓库允许多个开发者同时推送更改,而不用担心冲突或覆盖他人正在工作的文件。
Git 裸仓库是 Git 中一种特殊类型的仓库,主要用于远程服务器端,支持多人协作和集中式版本控制。它没有工作目录,所有操作都通过 Git 命令完成,非常适合团队开发和 CI/CD 流程。
/path/to/repo.git/
├── branches/
├── config
├── description
├── hooks/
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ ├── pre-receive.sample
│ ├── pre-rename-branch.sample
│ └── update.sample
├── info/
│ └── exclude
├── objects/
│ ├── info/
│ └── pack/
└── refs/
├── heads/
├── notes/
└── tags/目录和文件说明
| 目录/文件名 | 描述 |
|---|---|
branches/ | 存储符号引用(symbolic references),表示分支的位置。现代 Git 版本中,这个目录通常是空的,因为分支信息主要存储在 refs/heads/ 中。 |
config | 包含仓库的配置信息,类似于 .git/config 文件。你可以在这里设置默认分支、远程仓库等。 |
description | 用于描述仓库的内容。主要用于 GitWeb 等工具显示仓库描述信息。 |
hooks/ | 包含各种 Git 钩子脚本。默认情况下,这些文件是示例脚本(带有 .sample 后缀)。你可以移除 .sample 后缀并编辑它们以实现自定义功能。 |
info/ | 包含一些全局信息文件,如 exclude 文件,用于指定全局忽略规则。 |
objects/ | 存储 Git 对象(提交、树、blob 和标签)。这是 Git 的核心数据存储区域。 |
info/ (objects/) | 包含对象数据库的信息文件,如 packs 列表。 |
pack/ (objects/) | 包含打包的对象文件,用于提高性能和节省空间。 |
refs/ | 存储对提交对象的引用(如分支和标签)。 |
heads/ (refs/) | 每个分支对应一个文件,文件内容是该分支最新提交的哈希值。 |
tags/ (refs/) | 每个标签对应一个文件,文件内容是该标签指向的提交或对象的哈希值。 |
notes/ | 用于存储注释引用(如果使用了 Git Notes 功能)。 |
提示
info/ 出现了两次,一次是顶层目录,另一次是 objects/ 下的子目录。为了区分,我们在表格中添加了额外的说明。 pack/ 是 objects/ 下的子目录,因此在表格中也进行了相应的说明。 heads/ 和 tags/ 是 refs/ 下的子目录,同样在表格中进行了说明。
Git 钩子(hooks)是 Git 提供的脚本机制,允许你在特定事件发生时执行自定义脚本。这些钩子可以用于自动化各种任务,如代码审查、测试运行、部署等。Git 钩子分为客户端钩子和服务器端钩子两大类。
客户端钩子
客户端钩子在开发者本地机器上触发,通常用于验证或修改即将提交的内容。
常见的客户端钩子见表格:
钩子名称 触发时机 作用 pre-commit 提交前 验证提交内容 commit-msg 提交后 验证提交信息 pre-push 推送前 运行测试、检查远程分支是否最新等 post-push 推送后 验证提交内容 服务器端钩子
服务器端钩子在远程仓库上触发,通常用于验证或响应推送操作。常见的服务器端钩子见表格。
钩子名称 触发时机 作用 pre-receive 推送前 验证推送操作,如拒绝推送特定分支等。 update 推送时 验证推送操作,如拒绝推送特定分支等。 post-receive 推送后 运行测试、检查远程分支是否最新等。
迁移步骤
- 创建一个裸仓库,并添加一个post-recieve脚本,用于接收git push事件,并自动部署到服务器上。
- 创建一个VuePress项目,并安装PlumePress主题,并配置相关参数。
- 将VuePress项目代码推送到裸仓库中,并等待post-recieve脚本执行完成。
- 测试访问,确保项目正常。
迁移过程
服务器裸仓库配置
创建裸仓库专用账户
在远程服务器上创建一个用户,用访问仓库。
adduser yanling创建裸仓库
选择一个位置放置仓库,并且把新建用户的主目录修改到这里。
mkdir /opt/yanling -p usermod -d /opt/yanling yanling创建裸仓库。
git init --bare yanling.git修改post-receive脚本
提示
结束
本地创建PlumePress项目并配置
步骤 1
console.log('Hello World!')步骤 2
这里是步骤 2 的相关内容
步骤 3
提示
提示容器
结束
推送到远程服务器的裸仓库
步骤 1
console.log('Hello World!')步骤 2
这里是步骤 2 的相关内容
步骤 3
提示
提示容器
结束
测试
步骤 1
console.log('Hello World!')步骤 2
这里是步骤 2 的相关内容
步骤 3
提示
提示容器
结束
参考文章
迁移后
误操作老博客的Mysql数据库,导致部分文章丢失。。。
难受啊。。。
贡献者
更新日志
80cdb-``` build(docs): 更新文档主题版本缓存于8bd29-'update'于
