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を使いたくても使えない環境がたくさんあった。
Subversionも svn:// などというプロトコルを使うと同じ問題にぶち当たるが、あちらさんは 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-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
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.