YAMAGUCHI::weblog

海水パンツとゴーグルで、巨万の富を築きました。カリブの怪物、フリーアルバイター瞳です。

GitHubのPull Requestからpatchを取得して試す

はじめに

こんにちは、OpenTelemetry推進委員会です。OpenTelemetryのワークショップをしにベルリンに来ているんですが、そこで事前準備をしていたところ、ワークショップのコードがupstreamの直近の変更で動かなくなり、あわててcohostがPull Requestを投げました。これを承認前に自分で手元で試すためにPull Requestだけのパッチが必要になったけれども、そういえばやったことがないなと思って調べたところ、非常に簡単だったのでメモしておきます。

パッチファイルを持ってくる場合

$ cd /path/to/repo
$ wget https://github.com/username/reponame/pull/:pull_number.patch
$ git am -3 number.path

もしくは hub コマンドを使って

$ cd /path/to/repo
$ hub am -3 https://https://github.com/username/reponame/pull/:pull_number.patch

.patch のURLについて

「ドキュメントに書いていない裏技!」みたいな感じで書いてあるブログ記事がたくさん、あって「本当にそうなのか?」って思って調べてみたところ、たしかに丁寧には書いてなかったが一応公式ドキュメントのAPIレスポンスの中にそのURLが含まれていることは確認した。

developer.github.com

同じようにしてdiff形式のファイルも取得できる。

git am の -3 オプション

git am で 3way merge をする際のオプション。そこまでややこしいパッチを試したことがなかったので使ってなかったけど、とりあえずここではメモのためにつけておく。

ブランチを取ってくる場合

てっきり次のようにしてフォークされたブランチを取ってくるのかと思っていました。

$ git fetch git@github.com:username/forked-repo branchname

しかしGitHubはremote refのエイリアスを用意してくれていたんですね。

help.github.com

$ git fetch upstream pull/ID/head:branchname

ヘルプを見るとレポジトリの書き込み権限がないとできなさそうな雰囲気で書いてるけれど、普通に全然関係ない人でも取れました。

両方あるけどどっちがいいの

git fetch 一回で取ってこれるのでブランチを取ってくるほうが楽そうですね。

じゃあpatchやdiffの方はいらないかというと、patchとかdiffの場合はprivate repoでも一時的にURLを生成して外から取ってこれるので、クリーンな環境でパッチを当てなければいけないときに便利です。