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なんかで自動化しようとすると面倒くさいかなと思う。
これ! という管理フローが見つからない。