プロキシ経由でgithubにpull&pushする

(2009/07/13追記)勘違いしていた部分や、今までできなかったことを修正・補足しました。
(2011/03/09追記)ときどきこっちの記事に引っかかる人もいるようでなんか申し訳ないので追記。今はGithub側でhttps経由でのpushにも対応してるのでこのバッドノウハウは不要です。http://d.hatena.ne.jp/nobeans/20100423/1271983544

やりたいこと

自分の管理管轄外にあるプロキシに閉じ込められた環境からgithubへつなげたい。pullだけじゃなくpushもしたい。

方針

以下の2つのサイトの折衷案みたいな方法でうまくいきました。


id:rx7さんのところで使ってる corkscrew の代わりに2つめのサイトのconnect.cを使いました。


何かそっちのほうがメリットがあるのか?といわれると、別にないです。
ちょっと混乱してハマってるときにsshの仕組みについて教えてくれた人が紹介してくれたのがこれだった、というだけ。
ああ同じことをしてくれるツールなんだなーと後で気がついたw。
corkscrewでもどっちでもいいんだと思います。たぶん。


なので、id:rx7さんの方法との違いというと、環境変数GIT_PROXY_COMMANDを使うんじゃなくて、sshのconfigファイルでgithub用の接続設定を指定するところがポイントってことになりますかね。
お好きな方でどうぞ。

id:rx7さんの方法との違いは、sshプロトコルに対するプロキシ設定を弄ることで、自分のgithubリポジトリに対して、HTTPプロキシ経由でpush/pullができる点ですね。
他人のリポジトリをcloneする場合は、GIT_PROXY_COMMANDを使ってgitプロトコルに対するプロキシ設定を弄ってやる必要があります。この方法は最後に追記します(connect.exeを使うところ以外は、id:rx7さんの方法とほぼ同じです)。
(2009/07/13修正)

手順

githubへの公開鍵登録

RSAの鍵対を作って、公開鍵をgithubに登録します。

 $ ssh-keygen -t rsa -f github

-fオプションを上のように指定しておくと、github(秘密鍵), github.pub(公開鍵)という名前で生成されるため、元々存在する(であろう)メインの鍵対と衝突しなくて便利です。


github.pubの内容をまるまるコピペして、githubに登録しましょう。
なんのひねりもない普通の手順なので、githubのドキュメントか誰かのブログを参考にして下さい。

connect.cのコンパイル

Windows上のcygwin(gccインストール済み)でやりましたが、特にオプションなしで普通に通りました。
環境によると思うので、だめな場合は試行錯誤してみてください。

 $ gcc -O2 -o connect  connect.c
 $ cp connect <INSTALL_DIRECTORY>/connect

バイナリを適当なディレクトリ($HOME/binなど)にいれておきます。

$HOME/.ssh/configの設定

以下のように追記します。

Host github.com
    User git
    HostName ssh.github.com
    Port 443
    ProxyCommand <INSTALL_DIRECTORY>/connect -H <YOUR_PROXY_HOST>:<YOUR_PROXY_PORT> %h %p
    IdentityFile ~/.ssh/github

※INSTALL_DIRECTORY, YOUR_PROXY_HOST, YOUR_PROXY_PORTは実際の値を指定します。

(2009/07/13修正)HostNameとPortを追記しました。プロキシサーバから外部22ポートへのCONNECTが許可されている場合は、HostNameとPortがなくても大丈夫です。

疎通確認

以下のように普通にgit-cloneを実行してみると、ちょっと重たいですが無事にcloneできると思います。

 $ git clone git@github.com:<YOUR_GIT_ACCOUNT>/<YOUR_PRODUCT_NAME>.git

pushもそのままできる、はず。たぶん。
その環境ではまだプロダクトの公開準備ができていないので、試していないんですけど・・・・。



色々はまったりしましたが、できてしまえばたったこれだけなんですねぇ。


この方法は、プロキシで443ポートが許可されてる環境ならうまくいくと思います。
https(443)のくせになんか怪しい内容っぽいぞ?と、パケット内容で推測するたぐいのアクセス制御が入ってしまうとダメなんでしょうが、そこまでやってるところはそんなにないんじゃないかなーと楽観的に思ってみたり。

[2009/07/13追記] 他人のリポジトリをgitプロトコルでcloneする場合

他人のリポジトリをcloneする場合は、GIT_PROXY_COMMANDを使ってgitプロトコルに対するプロキシ設定を弄ってやる必要があります。
connect.exeを使うところ以外は、id:rx7さんの方法とほぼ同じです。

シェルスクリプトの作成

以下のようなシェルスクリプトを作成します。ファイル名はgit-proxy.shなどとしておけばよいでしょう。

#!/bin/sh
<INSTALL_DIRECTORY>/connect -H <YOUR_PROXY_HOST>:<YOUR_PROXY_PORT> $1 $2

※INSTALL_DIRECTORY, YOUR_PROXY_HOST, YOUR_PROXY_PORTは実際の値を指定します。

環境変数GIT_PROXY_COMMANDの設定

環境変数GIT_PROXY_COMMANDにこのシェルスクリプトのパスを指定します。
.bashrcなどでexport指定しておくと良いでしょう。

export GIT_PROXY_COMMAND=<INSTALL_DIRECTORY>/git-proxy.sh

※INSTALL_DIRECTORYは実際の値を指定します。

疎通確認

以下のように普通にgit-cloneを実行してみると、無事にcloneできると思います。

 $ git clone git://github.com/<ANY_GIT_ACCOUNT>/<ANY_PRODUCT_NAME>.git

※プロキシで9418に対するCONNECTが許可されていないとたぶんNG。その場合は管理者に泣きつくか、自前のプロキシを用意して多段プロキシにするとか・・・。