github pagesでもjekyllのプラグインを使いたい

github pagesはプラグイン使えないので、プラグイン使いたい場合はローカルでコンパイルして静的ファイルをpushする必要があるんだけど、その場合ソースファイルの管理どうすればいいんだってのが問題になる。

URLを

http://<username>.github.com/<reponame>/_site/

とかにすれば話は単純だけど、できれば

http://<username>.github.com/<reponame>/

でやりたい。github pagesでDocument Root的な設定が可能ならそれで済む話なんだけど、できないのでどうにか頑張るしかない。

で、Octopressってプラグイン使ってgithub pagesにデプロイできるけどどうしてんだろと思って調べてみた。Octopressは

$ rake deploy

ってやるとデプロイできるようになってる、んでこのdeployってタスクは何をしてるかというと、

desc "deploy public directory to github pages"
multitask :push do
  puts "## Deploying branch to Github Pages "
  (Dir["#{deploy_dir}/*"]).each { |f| rm_rf(f) }
  Rake::Task[:copydot].invoke(public_dir, deploy_dir)
  puts "\n## copying #{public_dir} to #{deploy_dir}"
  cp_r "#{public_dir}/.", deploy_dir
  cd "#{deploy_dir}" do
    system "git add ."
    system "git add -u"
    puts "\n## Commiting: Site updated at #{Time.now.utc}"
    message = "Site updated at #{Time.now.utc}"
    system "git commit -m \"#{message}\""
    puts "\n## Pushing generated #{deploy_dir} website"
    system "git push origin #{deploy_branch} --force"
    puts "\n## Github Pages deploy complete"
  end
end

こんな感じ。_deployというディレクトリにgh-pagesブランチをチェックアウトしておき、jekyllで出力したファイルを_deployディレクトリにコピーし、git pushまでやる。_deployディレクトリは完全にgithub pagesのデプロイ用ディレクトリで、ソースはその上にあるので、gitのディレクトリが二段階になるようになる。

.
├── .git        # ソースファイルのリポジトリ
├── _config.yml # 他にもこの階層にファイルいっぱい
├── Rakefile    #
├── _deploy     #
│    └── .git   # gh-pagesのリポジトリ
└── public      # jekyllの出力先。こいつから_deployにコピーされる

つまりソース用のブランチとデプロイ用のブランチを分け、ソース用のブランチでdeployタスクを実行するとデプロイブランチにファイルをコピってpushしてくれるってこと。やや強引だけどこれ以外にあんまりいい方法も思いつかないので真似してみた。

https://github.com/pxgrid/js-flipsnap/tree/gh-pages-src
https://github.com/pxgrid/js-flipsnap/tree/gh-pages

上がソースのブランチで下がデプロイ用のブランチ。OctopressのRakefileは色々やりまくってて超長いので参考にしつつ必要そうなので書いてる。
https://github.com/pxgrid/js-flipsnap/blob/gh-pages-src/Rakefile