はじめに
こんにちは、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が含まれていることは確認した。
同じようにしてdiff形式のファイルも取得できる。
git am の -3
オプション
git am で 3way merge をする際のオプション。そこまでややこしいパッチを試したことがなかったので使ってなかったけど、とりあえずここではメモのためにつけておく。
ブランチを取ってくる場合
パッチの形で取得して git am でパッチ当てするよりも
— m.tei / ishii (@mtei) 2019年11月4日
git fetch で、直接ブランチまるごととって来る方が楽だと思いますよ。
てっきり次のようにしてフォークされたブランチを取ってくるのかと思っていました。
$ git fetch git@github.com:username/forked-repo branchname
しかしGitHubはremote refのエイリアスを用意してくれていたんですね。
$ git fetch upstream pull/ID/head:branchname
ヘルプを見るとレポジトリの書き込み権限がないとできなさそうな雰囲気で書いてるけれど、普通に全然関係ない人でも取れました。
両方あるけどどっちがいいの
git fetch
一回で取ってこれるのでブランチを取ってくるほうが楽そうですね。
じゃあpatchやdiffの方はいらないかというと、patchとかdiffの場合はprivate repoでも一時的にURLを生成して外から取ってこれるので、クリーンな環境でパッチを当てなければいけないときに便利です。