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/HEAD
をgit 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が作成されました。ダミーファイルとかコミットしなくても何か方法があるのかもしれないけど、とりあえず。
*1:インデックスファイル