submodule (やsubtree)を使ったGitHub Pagesの管理フローは良いのだけど、もっと適当な感じでやりたいなと色々試している。要件としては生成に使ってる仕組みやログは非公開にしたいので、rebaseからpush -fのような変更を取り込んで更新する仕組みは使えない、というくらい。最新の実験ではclean -fでステージされてないファイルを削除できることを利用してやってみている。

まずはビルド。masterブランチでビルドしてindex.htmlなどをバンバンそこに吐いていくような雑なケース。

$ npm run build
$ git add --all
$ git commit --all --message="Rebuild"

これでGitHub Pagesに必要なファイルが生成され、masterブランチにコミットされた状態になった。

$ git checkout gh-pages
$ git checkout master -- "*"

gh-pagesブランチへ切り替えて、masterブランチで変更されたファイルを全部持ってくる。事前にgh-pagesブランチでは手作業で必要なファイルだけを残したり、CNAME.nojekyllなどgh-pagesブランチでのみ必要になるファイルをコミットしたりして構成を整えておく。このまま全部コミットすると構成がグチャグチャになるので、以下のようにして必要な(*.html)のみコミットするように頑張る。

$ git reset
$ git add *.html **/*.html
$ git clean -f
$ git commit --all --message="Rebuild"

resetを引数なしで呼んで、全ファイルをステージされていない状態にし、必要なファイルだけステージし直す。その後余ったステージされていないファイルをclean -fで削除するという形。これでmasterブランチで変更された*.htmlだけgh-pagesブランチにもコミットされた。

$ git push origin gh-pages
$ git checkout master

最後にgh-pagesブランチだけpushしてmasterブランチへ戻って完了。


Gitではgit checkout master -- <paths>...masterブランチから特定のファイルを持ってこれるのだけど、ここでグロブがうまく使えなくてハマり、こういった強引なやり方になった。多分だけどGit側の制限ではなく、MSYSのエスケープがらみの問題だと思うけど、解決できなかったので分からない。"*"だと全部持ってこれることはわかったので、clean -fを組み合わせて強引にやってみている。今のところうまく動いてる。

HTMLやCSSなど、GitHub Pagesに必要なファイルをサブディレクトリに保存したり、吐くようにして、そこをGitリポジトリにすると安定だとは思う。ビルドをこなす親ディレクトリ側からは無視するようにすれば良い。けれどそうするとサブディレクトリに移動してGitの操作をし、それから戻ってこなくてはならなくなるので、npmやGruntなんかで自動化しようとすると面倒くさいかなと思う。

これ! という管理フローが見つからない。