「git 互換 patch」で検索すると、次のようなページがすぐ見つかる。
こうか!
$ git show --no-prefix 5f682fb657439fe518475e6effc6e7e30b1dfd33 > patch.1
だが、Windows では、このパッチを適用すると
$ patch.exe < ../../patch.1 patching file readline.go Assertion failed: hunk, file ../patch-2.5.9-src/patch.c, line 354
とエラー終了してしまう。「patch assertion failed」でググると、すぐ対処方法を記載したページが見つかる。
どうも、改行コードが LF だと、こうなってしまうようだ。パッチコードの改行コードを変換してもいいんだが、お手軽にバイナリモードを使用した。
(パッチ作成) $ git show --no-prefix 5f682fb657439fe518475e6effc6e7e30b1dfd33 > patch.1 (パッチ適用) $ patch.exe --binary < ../../patch.1
しかし、assertion failed は、ひどいよな。もうちょっとマシなエラーメッセージは出せなかったものか…
余談1:UAC ダイアログ版
patch.exe は WindowsXP 時代のものを使うと UACダイアログが起動してしまう(「patch」という名前を含んでいるせい)。UAC ダイアログが出ないバージョンは 次より配布されている
余談2:-p オプション
パッチを作る側と、パッチを適用する場所で、ディレクトリの深さが違うと当然だが、パッチ適用が失敗する。
patch コマンドの -p オプションを使うと、パッチの相対パスの深さを減らすことができる。-p0 だとそのまま、-p1 だとディレクトリを一つ減らすという感じだ。