GitHubのプル・リクエストはGitHubのヘルプやカンニング・ペーパーで取り上げられているようにローカルにチェックアウトすることができる。カンニング・ペーパーではその最後でグローバルに設定すると便利と書かれているが、これを設定すると厄介なことになる。
まずorigin
としてリモート・リポジトリが追加できなくなる。~/.gitconfig
にremote.origin
セクションを作ることになるので、ローカルでこれを追加しようとすると、既にあると解されるため追加できない。
代わりにremote set-url
でリモート・リポジトリのURLを指定できるが、今度はremote.origin.fetch
が適切に設定されていない状態になるので、git branch --set-upstream-to=
やgit push -u
などがうまく動かなくなる。
他、git remote
でorigin
をリネームしたり削除したりしようとするとエラーを返されたり、静かに失敗し期待した結果になっていないことが多々ある。また巨大な歴史あるリポジトリをgit clone
すると大量のプル・リクエストが降ってきて大変なことになったりも。百害あって十利くらい。
プル・リクエストをローカルに持ってきたいことはもちろんあるので、僕は以下のようにエイリアスを使って番号指定でプル・リクエストをチェックアウトできるようにしてる。
[alias]
checkout-pull-request = !sh -c 'git fetch origin pull/$1/head:pr-$1 && git checkout pr-$1' -
Gitのエイリアスは結構前からなんでも出来るようになってるので、こんな感じに引数を参照して複数のGitサブコマンドをつなげたりも出来る。最後の-
が重要。
$ git checkout-pull-request 1 From https://github.com/hail2u/example * [new ref] refs/pull/1/head -> pr-1 Switched to branch 'pr-1'
でも存在をすぐ忘れるのであんまり使ってない……。hub使うのが無難そう。