我最开始希望弄个使用 PHP+MySQL 的博客系统,很大一部分原因便是我无需担心本地情况。后来因为实在忍受不了缓慢的加载速度与稳定性,又因不想多加开销,于是使用了静态博客(虽然国内使用了 GitHub+Cloudflare 后速度也不咋地)。

这种系统虽然优势明显,不过暂且不说发布文章依赖本地环境(在线部署也行,不过暂时没时间折腾),而且一旦电脑寄了或者重装系统等,恢复起来就很麻烦。重装环境还能忍受,源文件嘛……

U 盘、网盘备份固然可行,但每次都要手动复制文件,不麻烦?

我既然选择了把博客部署到 GitHub 上,何不把源文件也同步上去?

前言

  1. 本文中部分内容需根据自己的环境进行修改。
  2. 我知道有个叫“hexo-git-backup”的插件,不过因为某些原因我没能配置生效,故本文不讨论。
  3. 本文部署平台以 GitHub 为例。本文默认各位的 Hexo 能正常运行,Git、Node.js、SSH 等东西已经配置完成。
  4. 本文提及的方法不唯一。

创建仓库

在 GitHub 上创建个新的仓库(使用博客所在仓库的分支也是可行的,此处为方便故另建仓库),这里可以选择Private。创建完后,进入刚才创建的仓库,点击Code按钮(应该是绿色的),将Clone中的地址复制,随后在本地找个空文件夹,打开 Git,输入:

1
git clone 【HTTPS Git 地址】

等待执行完成后,clone 的目录中会出现.git文件夹,之后将该文件夹复制到你的 Hexo 目录下(即平常执行hexo d等命令的目录)。

确保当前目录(指 Hexo 目录)下存在.gitignore文件,没有的话自己创建个便是。

一定要在推送前就创建此文件并配置完成,否则当 Git 已开始管理这些文件之后,就无法再通过过滤规则过滤它们。如果已经把不想上传的文件上传了,必须先从远程仓库删了它,然后 pull 代码到本地仓库,或者从本地删除这些文件并且在。gitignore 文件中添加这些你想忽略的文件,然后再 push 到远程仓库。

编辑该文件,写入:

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

以上是上传时候忽略一些文件(如果有其他不想备份的文件在此目录下,也可以自行添加)

推送

在此目录下打开 Git 并输入【注:此条选做】:

1
2
3
git remote rm origin
git remote add origin 【HTTPS Git 地址】
# 重新添加仓库

然后输入:

1
2
3
git add .
git commit -m 'source' # 引号里的东西可自定义带必须要有,作为推送摘要。
git push origin main # 把本地仓库 push 到 github 上,如果没有配置密钥,此步骤需要输入账户密码

恢复

1
2
3
4
5
6
git clone -b hexo git@github.com:【用户名/组织名】/【仓库名】.git
# 在本地新拷贝的【仓库名】.git 文件夹下通过 Git bash 依次执行下列指令:
npm install hexo
npm install
npm install hexo-deployer-git
# 不需要 hexo init

后记

该操作会影响博客仓库的部署吗?

编译后的文件部署是根据_config.yml中的配置执行,与前面备份源文件不冲突(除非你把备份和部署的仓库与分支均设置成同一个)。

备份后发现 GitHub 仓库中 themes 文件夹中的主题文件夹上有白色箭头,点击无法访问

大概率是这个主题文件夹里面有.git文件夹(可能会被系统隐藏),GitHub 就将它视为一个子系统模块了。

删除文件夹里面的.git文件夹,然后在【blogroot】目录下打开 Git 终端依次执行以下命令(假设你使用的主题是butterfly且文件夹名也是这个;你将要推送到 GitHub 仓库分支名为main):

1
2
3
4
git rm --cached themes/butterfly
git add themes/butterfly
git commit -m "msg"
git push origin main

一般执行完前两条后,按照本文前面推送那节中重新添加仓库一条执行,即可推送成功。