unified 形式のpatchファイルを修正する。

要約すると、unified形式のdiffの出力する、hunkごとの数字の意味をきちんと理解してなかったので苦労したよ、という話です。

経緯

あるOSSでバグがあるのでpatch作って、git format-patchで投げてやろうと、developブランチをベースにしたトピックブランチでpatchを作成していました。ただ、実際にプロダクション環境で使うのはmasterブランチです。masterにbackportして実際に動作させてテストするのに、手元の開発環境からとりpatchだけ生成して、検証環境にパッチだけscpしてやり適用した際のお話。

適用に失敗したhunkの内容。

hunk単位ではちゃんと適用できるものと、失敗するものとがあったので、コードを比べてみたら、一つは変更途中に一行だけmasterブランチに存在しないコードがpatchには存在していました。もう一つは、同じファイルの一番最後に追加した変更だったのですが、masterとdevelop ブランチとで明らかに行数が違っていました。masterブランチのHEADからdevelopブランチのHEADのコミットの差は、ちょうどそのファイルに対する変更だったようです。

一つ目のhunkの修正。

とりあえず、適用に失敗した一つ目のhunkは、開始位置は変わっていなかったので、対象範囲の行数を-1することで適用出来ました。

二つ目のhunkの修正。

問題は二つ目です。開始位置がそもそも全然違うので、masterブランチの方で該当する位置の行数を確認します。変更内容自体は追加だけだったので、変更前後のhunkの行数は変わらないのに、その意味を理解してなかったので、範囲指定の行数を闇雲に変更してしまい、”malformed patch”でエラーを何度も吐いていた、という次第です。

まとめ。

今までその辺ちゃんと勉強せずにきたので、理解できてちょうど良かったですが、こういう基本的なことで理解してないことはまだまだ沢山あるなぁ、と反省した帰り途。