GithubのProject Pagesを作る手順を調べてみた。もしくはgitで空ブランチを作る方法を調べてみた。


http://kanonji.info/blog/2013/12/19/git%E3%81%A7%E7%A9%BA%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/
空ブランチを作るオプションで、もっと簡単に作る方法がありました。
Github pagesは、今はマウスクリックで作るだろうから、空ブランチを作る方法、だけです。

Githubではプロジェクトの公式サイトなどに使えるProject Pagesが作成できます。username.github.com/repo-nameという感じのURLになるんですが、未作成の場合は画像の様な、作成の手順が表示されます。

cd /path/to/repo-name
git symbolic-ref HEAD refs/heads/gh-pages
rm .git/index
git clean -fdx
echo "My GitHub Page" > index.html
git add .
git commit -a -m "First pages commit"
git push origin gh-pages

見慣れないコマンドもあって、なにが起こるかよく分からないし、そのまま入力するのはちょっと怖いので調べてみました。

Caution: make your working directory clean before you do this (either stash or commit), otherwise this will lose any changes you've made to your project since the last commit.

この通り、この手順はワーキングツリーから全部消すから、予め全部コミットしておくか、stashして置くように警告があります。

まとめ

どうやらこの手順は、空のブランチを作る方法のようです。Project Pages用であるgh-pagesブランチには、masterとは全然関係の無いデータを入れるので、単にmasterから枝分かれしたブランチでは不都合って事ですね。ちなみに、実はまだgitでブランチを切った事が無いんですが、検索してみるとgit branchでは空でmasterと切り離されたブランチが作りにくいようです。

git symbolic-ref HEAD refs/heads/gh-pages HEADをrefs/heads/gh-pagesに設定する
rm .git/index 索引ファイル*1を削除する
git clean -fdx ワーキングツリーのUntrackedなファイル・ディレクトリを削除する

解説

一応解説を書きますが、gitを深いところまで理解してないので、間違いや勘違いも含んでるかもしれません。

git symbolic-ref HEAD refs/heads/gh-pages

refs/heads/gh-pagesがなんて呼び方をされる文字列か分かりませんが、これはgh-pagesブランチを表しているはずです。

$ cat .git/HEAD 
ref: refs/heads/master
$ git checkout -b gh-pages #もしくは git branch gh-pages; git checkout gh-pages
Switched to a new branch 'gh-pages'
$ cat .git/HEAD 
ref: refs/heads/gh-pages

この様に普通方法でブランチを作りチェックアウトしたら、HEADはrefs/heads/gh-pagesに設定されます。git branchでは、引数無しではHEADを、指定しても過去のリビジョンを元にブランチを切るので、空のブランチが作れないようです。なので、.git/HEADgit symbolic-refで変えて、gh-pagesブランチを作るようです。ただgit branchで確認できるのは、何かしらコミットをした後でした。

rm .git/index

.git/HEADを切り替えても、ワーキングツリーやその他色々な部分がmasterのままです。なので、まずは索引ファイルを削除します。索引ファイルは、調べたところ名前の通りindexとかstageと呼ばれるものの実体だと思います。例えばgit addをすると.git/indexに追記されていきます。これはバイナリファイルなので、そのまま見てもよく分かりません((git ls-filesで確認出来るようです。))けども。ともあれ.git/indexの中身がmasterのままだとまずいので、消します。

git clean -fdx

後はワーキングツリーのデータを削除すれば、無理やり作ったgh-pagesブランチも、正真正銘のブランチになれます。git cleanはUntracked fileを削除するコマンドですが、多分.git/indexが消えてると全部Untrackedって事なんじゃないかと思ってます。

-f --forceです。どんな時にforceしないといけないのか分かりませんが・・・
-d Untrackedなディレクトリも消す
-x ignore ruleを参照せず全てのUntrackedファイルを消す

オプションはこんな感じです。この手順の中では、要するに全部消すって事でしょう。rmとかでやらないのは.gitディレクトリを消さないようにかな?

git push origin gh-pagesなど、残り

ワーキングツリーも空っぽになったら、改めてgh-pagesにコミットしたいファイルを作ってコミットします。コミットして初めてgh-pagesブランチは実際に作られるようです。あとはGithubにpushしたら、Project Pagesが作成されるはずです。

[GitHub] Page build successful [repos name]
[GitHub] Page build failure [repos name]

設定次第ですが、こんなタイトルの通知がメールで届きます。

余談だけどブランチ名が違う場合のgit pushの使い方

ところでgit push origin/gh-pages gh-pagesって書かなくて良いんだっけ?ブランチ切ったことないからこの辺が不安。と思ってちょっと調べてみたら、ローカルとリモートでブランチ名同じなら、そのままでいいぽい。違う場合はgit push origin :って感じで書くみたい。origin/remote にローカルのlocalブランチをpushする場合はgit push origin local:remoteって事かな。多分。

Forkした場合のProject Pagesの作り方

既にgh-pagesブランチがあるプロジェクトをForkした場合、最初はProject PagesにアクセスしてもNot Found扱いです。ダミーファイルを追加するでも、的当にファイルを変更するでも良いので、何かしらコミットしてpushするとProject Pagesが作成されました。ダミーファイルとかコミットしなくても何か方法があるのかもしれないけど、とりあえず。

環境

Mac Mac OS X 10.5.8(Leopard
git 1.7.3.5

*1:インデックスファイル