Githubをファイアウォールの内側から使えるようになった

Githubは、もはやファイアウォールの内側であってもread-onlyではない。

From now on, if you clone a repository over the http:// url and you are using a Git client version 1.6.6 or greater, Git will automatically use the newer, better transport mechanism. Even more amazing, however, is that you can now push over that protocol and clone private repositories as well.

Smart HTTP Support | The GitHub Blog

Githubはすばらしいサービスなのだが、数少ない欠点の一つが git:// などというキモい、もとい、珍しいプロトコルを使っていることであった。一般的な企業のファイアウォールは、こんなよくわからないプロトコルを使った怪しい通信は通してくれないことがほとんどだ。このため、Githubを使いたくても使えない環境がたくさんあった。

Subversionsvn:// などというプロトコルを使うと同じ問題にぶち当たるが、あちらさんは http(s):// を使えるのであまり問題にならない。同じことをGithubでできれば…!!

httpによる認証無しアクセス

できるようになったそうだ。

$ git clone http://github.com/idesaku/sandbox.git

これでgit-cloneできる。ただしこのURLはread-onlyである。つまり、git-pushできない。

確かこれはこれまでもやれたことだと思う。ただ、Git 1.6.6以降でサポートされた、より効率が良いプロトコルを使って通信してくれるようになった*1

httpsによる認証ありアクセス

しかし、Githubを利用するからには、見るだけじゃなくてgit-pushもしたいのだ。それが可能になったのが、今回のアップデートのすばらしいところ。

$ git clone https://[email protected]/idesaku/sandbox.git

URLにユーザ名を付加することで、認証が可能になった*2。実行するとパスワードを聞かれるが、これはGithub上に作っているアカウントのものを入力する。

Webインタフェース側も対応が終わっていて、新しいURLを簡単にコピペできるようになっている。

このURLを使用することにより、2つのことが可能になる。

プライベートリポジトリへのアクセス

従来は公開リポジトリしかgit-cloneできなかったが、このURLを用いることでプライベートリポジトリもgit-cloneできるようになった。

git-push

これが嬉しい!もはやread-onlyではないのだ。

$ git clone https://[email protected]/idesaku/sandbox.git
Password: 

(編集)

$ git push
Password: 
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 397 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To https://[email protected]/idesaku/sandbox.git
   ef90cd1..b12c41c  HEAD -> master

うまくいった。

認証の省力化

2012/02/02追記: Git 1.7.9から、OSが持っているキーチェーンアプリと連携してより安全に認証情報を扱えるようになった。とりあえずOS Xユーザはこちらの記事を参考に。

ところで、ユーザ名付きのURLを使うと、git-cloneやらgit-pushやらするたびにパスワード入力を求められるのがうざったい。これは、~/.netrcを下記のように書いておけば回避可能だ*3こちらの記事を参考にさせていただいた。

machine github.com
login idesaku
password YOUR_PASSWORD

こうしておけばパスワード入力が不要になるのに加えて、URLにユーザ名を含める必要すらなくなる*4

$ git clone https://github.com/idesaku/sandbox.git
Initialized empty Git repository in /Users/idesaku/sandbox/sandbox/.git/
remote: Counting objects: 46, done.
remote: Compressing objects: 100% (37/37), done.
remote: Total 46 (delta 8), reused 0 (delta 0)
Unpacking objects: 100% (46/46), done.

(編集)

$ git push
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 334 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To https://github.com/idesaku/sandbox.git
   b12c41c..0d2a5ec  HEAD -> master

やはりgit-push成功。

URLにユーザ名を含めた場合、Gitは~/.netrcの設定に関わらずパスワード入力を求めてくる。しかし、何も入力せずリターンすれば、続けて~/.netrcの設定を利用して認証を解決してくれる。

$ git clone https://[email protected]/idesaku/sandbox.git
Initialized empty Git repository in /Users/idesaku/sandbox/sandbox/.git/
Password:   <--- ここで何も入力せずにリターン。
remote: Counting objects: 49, done.
remote: Compressing objects: 100% (40/40), done.
remote: Total 49 (delta 9), reused 0 (delta 0)
Unpacking objects: 100% (49/49), done.

まとめ

このように、今回のアップデートでhttpsを使ってGithubをフルに利用できるようになったわけである。使い勝手も git:// を使う場合となんら変わらない。これでもうファイアウォールも怖くない!

*1:古いGitを使っている場合は、勝手に旧プロトコルに切り替えて通信するそうである。

*2:パスワードを送信するので、必ずhttpではなくhttpsにすること。

*3:パスワードを書き込むので、パーミッションを600あたりにしておいたほうがいい。

*4:パスワードを送っているのは変わらないから、必ずhttpsにすること!