自己编写Hexo发布脚本

hexo g会解析md文件, 生成html等静态文件, hexo d就可以发布静态文件, 这两个命令可以使用hexo g --deploy来代替

但使用一段时间后, 我发现hexo自带的发布命令并不好用, 于是我自己写了个发布脚本

为什么不好用

hexo g --deploy 的流程是这样的:

  1. 先把生成的静态资源放到public目录下(这是hexo g的作用)
  2. 再把.deploy_git目录下清空
  3. 接着把public目录下的文件及非空的文件夹拷贝到.deploy_git目录下
  4. 最后根据_cofig.yml里的配置, 把静态文件推送到远程仓库 git push -u --force origin master

后面几步都是hexo d的作用

那么, 这里就有3个问题:

  1. 为什么要做清空及拷贝到另一个文件目录的动作, 其实可以直接在public目录推送的
  2. 推送用了–force选项, 这样会把远程仓库的内容覆盖掉, 比如我在Github上建立README.md及CNAME文件, 则本地推送后这两个文件就没有了

那么, 其实我要做的, 就是少了清空及拷贝的动作, 以及推送时不覆盖远程的修改

自定义脚本

根目录下执行以下命令新建deploy.sh文件

1
2
touch deploy.sh
chmod +x deploy.sh

以下是脚本内容

1
2
3
4
5
6
7
8
#!/bin/sh
msg=`git log -1 --pretty=oneline | awk '{print $2}'`
hexo g
cd public
#rmdir * # 删除空文件夹, 已解析的md文件重命名时, 原来生成的文件夹会为空, 但其实git自动会忽略空文件夹的, 所以这句话并非必要
git add .
git commit -am $msg
git push

cd 到 public目录下, 执行以下命令

1
2
rm -fr * 
git clone your_git_repo_url . # 别忘了后面的点

这样就可以在根目录下使用./deploy.sh命令来发布Hexo博客啦

问题

其实上述方法有一个bug:

hexo clean清除缓存时, 会把public目录删除掉的, 因此再次发布时, 需要重新到public目录下克隆远程仓库

虽说清理缓存并不常见, 但因为有这么个bug, 这折腾了半天, 好像效果并不咋滴呀😰

其他技巧

取消推送时的force选项

可以使用修改源码的方式

找到node_modules/hexo-deployer-git/lib/deployer.js这个文件, 找到如下行

return git('push', '-u', repo.url, 'HEAD:' + repo.branch, '--force');

把后面的, '--force'删掉即可

return git('push', '-u', repo.url, 'HEAD:' + repo.branch);

发布静态文件时, 使用md所在的git的提交信息

注: 写博客我一共用到了两个git仓库
md等源文件在一个git仓库内
public目录下的静态文件在另一个git仓库内

默认发布时的提交信息是根据_config.yml文件的deploy配置下msg选项而来的, 如果_config.yml文件里没配置msg选项, 就会是Site updated: YYYY-MM-DD HH:mm:ss, 可以写个脚本每次发布动态编辑_config.yml文件, 提交信息与博客源码所在git的最新提交信息一致

根目录下执行以下命令新建deploy.sh文件

1
2
touch deploy.sh
chmod +x deploy.sh

以下是脚本内容

1
2
3
4
hexo g
msg=`git log -1 --pretty=oneline | awk '{print $2}'`
sed -i -e "s/msg: [^\]*/msg: $msg/" _config.yml
hexo d

发布时使用根目录下使用./deploy.sh命令即可

Fork me on GitHub