文章中涉及的命令,请在阅读完文章后酌情执行!

Hexo 博客网站的备份与恢复

作者 Breky    发布于    分类    标签

使用 Hexo + Github 搭建个人博客后,有重装系统(或使用新电脑)的情竞时,都必需重新搭建,并且所有文章也都需要备份。因此,搭建完成后可以将本地网站根目录中的内容备份(包括文章)。本文记录使用 Hexo + Github 搭建的网站的备份和恢复。

本机系统为 Manjaro

如果参照本文对网站进行备份,请通篇阅读后再执行命令。

备份

Hexo 的部署命令(hexo d)是将 hexo g 产生的 public 目录中所有文件上传到远程仓,而备份的内容是本地网站根目录下的所有内容。所以,备份的方式有3种:

  1. 远程仓分两个分支(master 和 backup),master 分支放 public 目录中的文件,backup 分支放本地网站根目录下的所有内容。
  2. 远程仓仅一个 master 分支,将本地网站根目录下的所有内容及 public 文件都上传到仓内,启用 Github Page 功能时,将网站部署到 master分支的 public 目录上。
  3. 两个仓(blog 和 blog_backup),blog 仓放 public 目录中的内容,blog_backup 仓放本地网站根目录下所有内容。

方式1 简单,但没搞明白远程仓的两个分支怎样同步本地仓的一个分支,略。方式2 也简单,但是 Github 在国内不稳,而国内 Gitee 的 Page 功能需要 Pro 版才可以自定义域名。嗯~,好吧,我承认针对方式2 我没有试验过,但理论上可行。所以,我选了方式3,Github 仓部署网站,Gitee 仓存放本地网站根目录下所有内容。

备份前的准备工作

备份前的准备工作就是要实现 hexo d一键部署。

假如建站时执行的命令是 hexo inin Demo,则 Demo 就是本地网站根目录。两个远程仓,Github 上的名为 blog,Gitee 上的名为 blog_backup(备份用)。

因为是本地一个仓对应两个远程仓,所以很容易操作。Demo 中添加远程仓别名 blog 对应 Github 上的 blog 仓,Demo/public 添加远程仓别名 blog_backup,对应 Gitee 上的 blog_backup 仓,然后逐一 push。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 以下命令是实验内容,不要执行
# Demo 目录中执行
git init
git remote add blog github_rep_ssh_url # github_rep_ssh_url 为 blog 仓的 ssh 地址

hexo clean
hexo g # 执行该条命令后会在 Demo 目录中产生 public 目录,这个目录中的内容需要上传到 blog 仓中

# Demo/public 目录中执行
git init # 不知道能不能执行
git remote add blog_backup gitee_rep_ssh_url # gitee_rep_ssh_url 为 blog_backup 仓的 ssh 地址

# git push 操作

但是 ,每次执行hexo g命令后,public 目录都会先删除再新建,很麻烦,并且 Git 机制好像也不允许嵌套(Demo目录及 Demo/public 子目录都 git init)。但可是,很幸运,Hexo 的 hexo-deploy-git 插件帮我们解决了这个问题,它会帮我们将 public 文件中的内容上传到远程仓中。所以,这个插件是刚需1

安装 hexo-deploy-git 插件

1
2
# Demo 目录中
npm install hexo-deploy-git --save

然后修改 Demo 根目录下的 _config.yml,新增 deploy 字段内容(或找到并完善)

1
2
3
4
5
deploy:
type: git
repo: git@github.com:breky/blog.git # 网站部署到了 Github 上,所以这里填写的是 Github 上 blog 仓的 ssh 地址
branch: main # Github 仓好像不支持 master 分支名了
message:

之后就可以使用hexo d一键部署了。

备份工作

实现hexo d一键部署后,备份方式3 就简化成把 Demo 目录中的所有内容上传到 Gitee 上的 blog_backup 仓中了。在 Demo 目录中执行以下内容:

1
2
3
git init
git remote add blog_backup blog_backup_ssh_url # Gitee 上的 blog_backup 仓的 ssh 地址
# 以上命令两条命令一次就够

在 Demo 目录中新建 .gitignore文件,内容为 git 上传时忽略的文件

1
2
3
4
5
6
7
.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/

继续在 Demo 目录中执行以下命令:

1
2
3
4
git add .
git commit -m "backup"
git push -u blog_backup master # gitee 上还是 master 分支名
# 以上三条命令每次备份都需执行

一键部署及备份

每次部署及备份的过程就是:

1
2
3
4
5
6
hexo clean
hexo g
hexo d
git add .
git commit -m "backup"
git push -u blog_backup

在 Demo 目录中新建 shell 文件,实现一键部署及备份,shell 文件名为 Deploy_Backup.sh,内容为:

1
2
3
4
5
6
7
8
9
echo "Starting Deploy and Backup"
rm -rf ./.deploy_git/ # 每次 hexo d 后都会产生,所以删除了吧,有时候网站的内容与本地不一致也是这个目录的原因
hexo clean
hexo g
hexo d
git add .
git commit -m "backup"
git push -u blog_backup
echo "Over"

修改 Deploy_Backup.sh 文件属性

1
sudo chmod 755 Deploy_Backup.sh

每次需要部署和备份时仅需要执行以下命令,实现一键部署及备份

1
./Deploy_Backup.sh

恢复

将 gitee 上的 blog_backup 仓 pull 到本地后,执行 npm install 命令。

恢复前的准备工作

恢复前本机需先安装 Hexo和 Git(Manjaro 自带此处略过)。安装完成后就直接进行恢复工作,不要建站2

恢复工作

在本机的某个位置(如:~/Document/)新建网站根目录(如:Demo),最后网站根目录 Demo 的完整路径为~/Document/Demo,之后的所有操作都会在 Demo 目录中执行3

1
2
3
4
5
6
git init
git remote add demo backup_rep_ssh # 备份仓 ssh 链接
git pull demo master # master 是本仓分支名
# 以上三条命令将本仓内容下载到了本地的 Demo 目录中

npm install # 新建 Hexo Scripts(hexo clean, hexo g, hexo d, hexo s 命令) 及安装需要的 Hexo 插件,即 package.json 中的内容

  1. 可以将 hexo-deploy-git 添加至 package.json 中,每次恢复时就不用单独安装这个插件了。↩︎

  2. 使用 hexo init demo 建站后,Demo 目录中有内容(本仓已有)。↩︎

  3. 后续会把本仓内容 pull 到 Demo 目录中,如果 clone 下来,则更改 blog_backup 文件名为 Demo(直接下载则需要先解压后更名), 之后的所有操作同样在 Demo 目录中执行。↩︎