在Github-Pages上应用jekyll博客插件

  张一帆   2016年11月28日


  经过很长的一段时间对jekyll的适应,深刻的感觉到了jekyll为什么说是适合程序员的博客系统,因为jekyll根本不适合那些只想专注于写作的人们。我所谓的“只想专注于”这个字眼意思是我就是上来写文章然后发布就完事的意思,而对于程序员来说“只想专注于”意思是经过折腾,搭建好一个看起来有那么点高大上的但是又不是唾手而得服务的那种。那么,jekyll就应运而生了。大家通过关键词搜索进来其实是想解决jekyll在Gh-Pages(下用gh代替,有很多文章直接就用gh来表示,也不说明一下这个替代的意思,根本就不在乎小白的心里)能够应用起插件的。我在这里告诉大家通过我的方法一定能够实现你的需求,而且我敢保证能够帮你理清你很多不懂的地方。我为什么这么自信呢?都因为我也是从小白起来的,科学上网(翻墙)查阅了很多的相关资料,而且阅读了大量的文献才终于慢慢试出了效果。在这里,我把我所遇到的和了解到的分享给大家。

  首先,大家需要理解一下gh是如何呈现出jekyll网站样子的。很简单,就是他会在两个分支(gh-pages 和 master)中读取网站信息然后展示_site文件夹中生成好的网站页面。具体哪个分支无所谓,你选择其一就成,我就是用master的。我们在本地用jekyll serve生成的网站可以原封不动的直接push到远端master,可是在你本地的_plugins文件夹内的插件到了gh上就失效了,想必你在看我的博客之前就已经知道是为什么了(–safe)。那么,我们需要将_site文件夹内的所有内容push到master上,也就是说master上只有_site文件夹内的数据。这样,gh就会直接读取网站了而插件也会变的好使了。至于为什么,我是这么理解的。master是整个jekyll代码,那么gh会多做一步就是编译master分支上的代码,然后你网站就能够读取编译后的内容了。这种方法显然不成,gh是不负责编译插件的,所以插件就不好使了。它不像在本地编译,因为本地就是我们自己操作,肯定是安全的。那另一种方法就是我们本地编译然后将编译好的数据(_site中的页面)直接push到master上,这样gh上存在的页面就是已经被编译好的页面(很多插件都是在做html转换再加上和js配合),而且插件实现的效果也能完美展现。不知道你们明白了没有?如果没明白那在留言区直接留言吧,我会回复你的。

  选择了第二种方法,现在就有一个问题。你现在应该有两个分支了,一个是你所有jkeyll的代码的分支,另一个分支就是master。(你可以到我这个博客的分支过来看看)这两个分支代码结构是不一样的,所以就产生了如何维护两个分支的问题。一个分支我们就用来本地写本地测,一个分支就负责往gh上发送编辑好的文件的。我觉得我这么说你应该明白了吧?

  好了,现在我们面临的问题就是,当jekyll编译完了插件以后,如何将这个分支上的内容copy到master分支上。这方面我看了很多外国的网站上很多人都提供出了一个bash脚本。大概意思就是改动jekyll分支然后切到master分支,然后将_site文件夹内的所有内容copy到根目录并删除其他文件以及_site文件夹,最后push到远端。在我这边我测试了很多次,不好用,不知道为什么脚本运行的最终结果总是出问题。后来又找到了另外一种方法,亲测成功。思路是,将_site文件夹进行重写(filter-branch)。一个非常狠的git功能,我建议你好好的去看看这篇文章《Git-工具-重写历史》

  我相信,在看到这块的时候你应该已经顺着刚才的连接爬到了新的方法那个页面了,如果你按照他那么做成功了,那么我祝福你。但是,希望你也看到了这行。因为,那个作者最后说要写个脚本,但是他没有提供。我写了,所以你可以直接copy我的到你的项目里。这个文件叫做publish-gh-pages.sh。怎么用呢?你只需要在你的写作的分支上先commit所有的更改,然后直接在命令行中输入(我的是mac)”./publish-gh-pages.sh master”,剩下的工作你就等待吧。它会将master发送到远端上,并且最后切回专用来书写的分支(我的分支叫docs,如果你想改成什么稀奇古怪的名字的分支的话,请把这个脚本中的docs替换成你的名字)

  好了,我想问题都已经解决了。你的解决了么?如果没有请留言,有的话直接点右上角的关闭即可。