自动备份Hexo源文件到私有仓库

Hexo 部署到Github的文件不包含主题文件,md文件,模版,配置文件等,在新电脑要重新部署相同环境写博客就要拷贝这些文件过去,可以通过文件共享,U盘拷贝,云盘等手段

还有一种方法就是把这些文件也推送到Github仓库,网上看到有一个hexo-git-backup可以把源码推送到仓库分支实现备份。但是我觉得这样不妥,由于部署到Github的静态网站仓库是公开的,把源文推送这个分支,意味着所有人都可以看到源文件的配置,包括一些个人的信息,可能有网站统计,收录的token,这样就不太好

看到一篇博文(https://0skyu.cn/p/a8bd.html) 就整的非常好,其中原理过程可以自行去研究

我参考这篇文章记录我自己的过程和操作


新建Github私有仓库

不用初始化创建README文件,

ScreenCaputure221205140509

ScreenCaputure221205140926

本地Hexo目录git设置

…or create a new repository on the command line

echo "# hexo-source-backup" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:kiraster/hexo-source-backup.git
git push -u origin main

使用上面的命令进行设置,进行第一次push推送,到 Github 网页端查看是否有文件上传

出现 error: failed to push some refs to 错误,使用强制命令git pull origin master --allow-unrelated-historie,如果还有其他命令报错自行查看文档或 Google,都是简单的小问题搜索引擎第一页就有

网上很多文章说要修改或创建一个名称为.gitignore的文件,其实这个在你部署静态文件到公共仓库就会有,保持默认就行

除此之外,有些主题在主题目录下有.gitignore文件,一般主题作者不会把主题配置文件_config.yml上传,这里要把这行去掉,使之上传到私有仓库

.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/
_multiconfig.yml

安装 shelljs 模块

npm install --save shelljs

自动备份脚本

创建一个js脚本文件,保存在博客目录下的scripts目录,文件名称自己定

第 38 行 的双引号提交信息 任意修改

第 15 和 41 行 的分支名称注意 保持和第二步骤中的保持一致,有些用人喜欢用main有些人喜欢用master

require('shelljs/global');
const logger = require('hexo-log')();
/* 
危险操作,注意查看控制台提示!!!
*/
hexo.on('generateBefore', function() {
  logger.info("Start pulling\n==================================================");
  pullToLocal();
  });

function pullToLocal() {
  if (exec('git stash').code !== 0) {
      logger.error('暂时存放出错,请查看提示处理');
  }
  if (exec('git pull origin main').code !== 0) {
      logger.error('同步到本地出错,请检查网络连接查看提示处理');
  }
  if (exec('git stash pop').code !== 0) {
      logger.error('重新应用缓存的stash出错,请查看提示处理');
      process.exit(-1);
  }
  logger.info("Pull done\n==================================================");
  }

try {
    hexo.on('deployAfter', function() {
      logger.info("Start pushing\n==================================================");
      pushToPrivateRepo();
    });
} catch (e) {
    logger.info("博客源码推送至私有仓库异常,错误提示:" + e.toString());
}

function pushToPrivateRepo() {
        if (exec('git add .').code !== 0) {
           logger.warn("添加文件到暂存区出错");
        }
        if (exec('git commit -m "Auto backup"').code !== 0) {
            logger.warn("没有提交的新内容或提交暂存区到本地仓库错误");
        }
        if (exec('git push origin main').code !== 0) {
           logger.warn("推送代码至github main 主分支出错");
        }
        logger.info("Push done\n==================================================")
        console.log("Ctrl + C 退出或关闭窗口退出或60秒后自动退出");
        setTimeout(() => console.log('q'), 60000)
    }

推送

执行hexo clean && hexo g && hexo d会自动调用这个脚本

……
……
INFO  Start pulling
==================================================
Saved working directory and index state WIP on main: 4978dc8 Auto backup
From github.com:kiraster/xxxx-xx
 * branch            main       -> FETCH_HEAD
Already up to date.
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   source/_posts/xxxx-xx.md

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (ce84730faef3bc908459561ad81e352ec3daeda6)
INFO  Pull done
==================================================
……
……
INFO  Deploy done: git
INFO  Start pushing
==================================================
[main 0f532bb] Auto backup
 1 file changed, 1 insertion(+), 1 deletion(-)
To github.com:kiraster/xxxx-xx.git
   4481470..0f532bb  main -> main
INFO  Push done
==================================================
Ctrl + C 退出或关闭窗口退出或60秒后自动退出

注意:

  • 出现没有提交新内容到缓冲区,推送等错误,按提示排查错误即可
  • 看到原博客出现要切换到博客目录的这一行脚本命令,我觉得在推送博客的时候你就已经切换到博客目录,去掉这一行