標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

Windows で git diff の結果を patch.exe で使う

「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 だとディレクトリを一つ減らすという感じだ。