gh-pagesをサブディレクトリ内で管理

2016-06-07

GitHubに置いているリポジトリの公開ページをGitHub Pagesで作る場合に、どうやって管理したらいいか自分のやり方をメモ。

gitで複数ブランチを編集する方法

GitHubでページをホストできるGitHub Pagesで、各リポジトリごとのページはgh-pagesというブランチの内容がアカウント名.github.io/リポジトリ名に公開される。

普段はmasterだかdevelopブランチで作業していて、ビルドで生成した内容をgh-pagesで公開したい場合に、gitの使い方でいろいろ方法がある:

  1. git branchでブランチを切り替えて修正を反映させる
  2. 別フォルダにgh-pagesブランチをチェックアウトしてそちらに更新内容を反映させる
  3. git subtreeを使う
  4. git worktreeを使う

1はそれぞれのブランチを同時に参照できない、2はフォルダを別の場所に作らないといけないのが面倒、3はよく知らない、で4の方法でやることにする。

gh-pagesブランチを親なしで作成する

まずは対象となるgh-pagesブランチを作成する。ブランチを作るときに通常であればgit branchまたはgit checkout -bなどとして作成するが、そうした場合には現在のコミットが親になってしまう。GitHub Pagesに公開したいブランチの内容は作業用のブランチとはまったく別の内容(成果物のHTMLなどだけで、ビルド用の設定ファイルやソースは必要ない)なので、現在のコミットからファイルを引き継がないほうが都合がよい。

gitでは--orphanで親のない、独立したブランチを作成できる:

$ git checkout --orphan gh-pages  # gh-pagesを親なしのブランチとして作成
$ git reset --hard # 今までいたブランチの内容がステージングされているので、クリアする
$ echo 'Hello' > index.html # 適当にファイル追加
$ git add index.html
$ git commit -am 'Create gh-pages'

git-worktree

git worktree

git-worktreeを使うと、指定のブランチをサブディレクトリ以下にチェックアウトすることができる。これを使うと作業用のブランチと公開用のgh-pagesブランチを切り替えずに、同時に編集することができるようになる。

$ git checkout master
$ git worktree add dist gh-pages # distがブランチをチェックアウトするディレクトリ名、gh-pagesが取り込むブランチ名

上記の例だとdistディレクトリ以下にgh-pagesブランチの内容(index.html)が格納される。

$ tree
.
├── MASTER.txt
└── dist
└── index.html

1 directory, 2 files

gh-pagesの更新

worktreeで指定したディレクトリ内にgh-pagesブランチの内容がチェックアウトされているので、その中のファイルを修正してコミット、プッシュでGitHubに上げると、GitHub Pagesに反映される。