github twitter instagram email rss
github.io(github-pages)でmaster以外のブランチをホストしたい
Oct 26, 2017
3 minutes read

本ブログの構成

本ブログは Golang 製の hugo という静的サイトジェネレータで生成しています。

生成した静的ファイルは github.io(github-pages) でホストしています。

問題点

github.io は github の提供している機能の一つで、リポジトリ一つに対し、ドキュメントなどの静的ファイルを配信できるサービスです。 これが中々便利で、フロントサイドのJavascriptフレームワークで静的コンテンツを作成したときにはここで配信しています。

一方、 github.io の本来の目的は、作成したプロダクトのドキュメントを配信するためのサービスになっているので、配信方法が限られています。

具体的に言うと、

  • /docs以下
  • gh-pagesブランチ
  • masterブランチ

のいずれかをルートとする配信方法に限られています。

また、中でも ユーザ名.github.io という名前でリポジトリを生成すると、そのリポジトリはプロダクトという扱いではなく、github ユーザのプロフィールページという扱い(つまりgithub.ioはプロダクトのドキュメント用として使えない)になるので、配信方法が master ブランチをルートとする 以外使えなくなってしまいます。

hugo では、基本的には対象のディレクトリで hugo というコマンドを叩くことで、指定のディレクトリに静的ファイルを生成します。 これを github.io で配信するには、master ブランチで指定のディレクトリに . を指定することで一旦は解決するでしょう。 しかし、生成用のディレクトリ群があるルートに、配信用ディレクトリに展開する予定だった静的ファイルが混在することになるので、運用上の見た目が悪いです。 おそらく、static , css , imgというディレクトリが同じディレクトリに混在することになるので「は???」ってなります。 WEB強者に足払いでもされてしまったらすぐに心がやられてしまうことでしょう。

import this
# 多分こうなる
├── archetypes
├── config.toml
├── content
├── public
├── static
├── themes
├── 404.html
├── about
├── blog
├── categories
├── css
├── fixed
├── img
├── index.html
├── index.xml
├── sitemap.xml
└── tags

プロジェクトのルートがこれではいただけません。

git-subtree コマンドで解決

となるとやはり hugo コマンドは指定のディレクトリに展開させてスッキリさせたいです。

# この例では配信用ファイルは public ディレクトリ以下
# その他は hugo の設定ファイルや記事の実体ファイルなど
├── archetypes
├── config.toml
├── content
├── public
├── static
└── themes

これをルートの構成とし、public 以下を github.io で配信したいです。

そこで、本構成を別ブランチで運用し、public 以下のみを master ブランチへ push します。 具体的には git subtree コマンドを使います。

% git branch develop
% git checkout develop
% git push develop

# このタイミングでgithubのリポジトリのセッティングから、
# メインブランチをmaster → developへ変更し、masterブランチを削除する

# public 以下を master ブランチをpushする
% git subtree push --prefix public/ origin master

こうすることで master ブランチにはpublic以下のみが置かれ、developではpublicを含めた全てのディレクトリが管理されます。

ただ、簡単なブログなのに、デプロイするたびにこんなコマンドを調べて叩くのもかったるいです。 git add から commit, pushまでの一連の流れを記述したデプロイ用シェルを作っておくと便利です。

#!/bin/bash
echo "---Now updating..."
echo "---Build by hugo."
hugo >/dev/null

echo "---git add & commit."
git add . >/dev/null
git commit -m "updated on `(date +"%Y/%m/%d")`" >/dev/null

echo "---git push /public from /public to master."
git subtree push --prefix public/ origin master &>/dev/null

echo "Open your GitHub-pages? [Y/n]"
read ANSWER

case $ANSWER in
    "" | "Y" | "y" | "yes" | "Yes" | "YES" ) open https://sin-tanaka.github.io/;;
    * ) echo "---Finish.";;
esac

echo "---Finish."

これでなにも気にせずサクサク push できるようになりました。 ついでに github に草を生やせて一石二鳥です。

と、ここまで書いてみてブラウザで見てみたらコードブロックにシンタックスハイライトが効いてない模様、、

頃合いをみて直すことにします。


Back to posts