前提・背景
-
GitHub Pages でプロジェクトサイトを公開する場合、プロジェクトの
gh-pages
ブランチに公開したいファイル群をコミットして GitHub のリポジトリにpush
する。 - TypeScript を使っている場合など、公開するファイル群のソースコードを
gh-pages
ブランチとは別に管理したい場合がある。- 例えば、
master
ブランチにgh-pages
で公開するファイル群のソースコードを管理して、ビルドの成果物をgh-pages
で公開したい、という状況。
- 例えば、
上記のような状況では、master
ブランチなどでビルドを行い、その成果物を gh-pages
にコミットしたいということになります。 ブランチの切り替えをせず、ローカルリポジトリを複数用意したりもせずにこれを実現するためのいい方法が確立されてないようなので、ちょっと考えてみました。
gh-pages
以外のブランチでビルドして成果物を gh-pages
ブランチにコミットする方法
Git の配管 (Plumbing) コマンドを使い、ツリーオブジェクトを作成し、コミットを作り、gh-pages
の参照先コミットを変更する、ということを行います。
具体的には “Committing a subfolder to the gh-pages branch from the other branch” に書いたとおりで、以下のような感じです。 (Windows PowerShell での例。)
# Step 1. ツリーオブジェクトの作成
git add -f ./build/gh-pages # ビルドの成果物を index に追加
# prefix を指定してツリーオブジェクトを作成
$treeObjId = git write-tree --prefix=build/gh-pages
git reset -- ./build/gh-pages # index から削除
# Step 2. コミットの作成
# 上で作成したツリーオブジェクトを基に、`gh-pages` ブランチの参照先コミットを親とするコミットを作成
$commitId = git commit-tree -p gh-pages -m "YOUR COMMIT MESSAGE" $treeObjId
# Step 3. `gh-pages` ブランチの参照先を上で作成したコミットにする
git update-ref refs/heads/gh-pages $commitId
もっといい方法があるかも? と思いつつ、特にいい方法が見つからなかったし思いつかなかったのでこんな感じでやることにしました。
他の方法 : master
ブランチでビルドの成果物もバージョン管理
ビルドの成果物も master
ブランチにコミットして良いのであれば、Git の subtree の仕組みを使うのが良さそうです。
個人的にはビルドの成果物を gh-pages
ブランチ以外にコミットするのはしたくないのでこの方法は採用しませんでした。