Githubの自分のリポジトリをfetchやpullする際にsshパスフレーズの入力を不要にする。もしくはリモートリポジトリをfetchとpushで別々に設定する。

$ git clone git@github.com:kanonji/test.git
#sshで通信するのでパスフレーズが必要。
$ cd test
$ git remote -v
origin	git@github.com:kanonji/test.git (fetch)
origin	git@github.com:kanonji/test.git (push)
$ git fetch
#sshで通信するのでパスフレーズが必要。

Githubで公開されてるリポジトリは原則誰でも読み込みが出来るもので、なにかとあるオープンソースソフトウェアをgit cloneでダウンロードして使うというのは、よくある使い方。この時、cloneしようがfetchしようがpullしようが、パスフレーズなんかの入力なんて無しにデータは取得できる。なのに、自分のリポジトリの場合はcloneにもfetchにもpullにも、パスフレーズを毎回要求されて、これが割りとめんどくさい。

解決方法

$ git clone https://github.com/kanonji/test.git
$ cd test
$ git remote -v
origin	https://github.com/kanonji/test.git (fetch)
origin	https://github.com/kanonji/test.git (push)
$ git fetch

他者のリポジトリをcloneする場合と同じ、HTTPのURLを使えばclonefetchpullも、無認証で取得可能になる。

$ git remote set-url --push origin git@github.com:kanonji/test.git
$ git remote -v
origin	https://github.com/kanonji/test.git (fetch)
origin	git@github.com:kanonji/test.git (push)

HTTPのURLは、そのままでもRead+Write accessだけど、認証*1Githubのwebにログインするユーザー名とパスワードを入力しないとならない。これはこれで面倒なので、originというリモートリポジトリのpushのほうだけ、SSHのURLに変更する。これで、fetchpullなどデータを取ってくるのは無認証で、pushは今までどおりsshパスフレーズで認証という使い方ができる。

HTTPのURLの代わりにGit Read-OnlyのURLでも良い
$ git clone git://github.com/kanonji/test.git

こっちでもいいんだけど、他者のリポジトリを取得する場合でも、デフォルトはHTTPの方なので、あえてこっちにしなくてもいい気がする。

$ git remote -v
origin	git://github.com/kanonji/test.git (fetch)
origin	git@github.com:kanonji/test.git (push)

この設定が済んでいるか確認するにも、ぱっと見でちょっとだけわかりにくいし。

*1:たぶんSSL越しのBasic or Digest認証?