LoginSignup
2
0

More than 5 years have passed since last update.

gitやsvn等の管理下のファイルにpatchコマンドを使うときは--no-backup-if-mismatchを付けると少し楽

Last updated at Posted at 2016-12-04

この記事はACCESS Advent Calendar 2016 5日目の記事です。

背景

私が扱うunified形式のパッチファイルは、適用対象のソースコードとパッチファイルの内容との間で、行位置がずれていたりパッチファイル内の周辺部分のコードが変更されていたりすることが多い。
そのようなパッチファイルを patch -pN <hoge.patch で適用すると、パッチが当たるファイルとパッチファイルの内容とに違いがあった場合に、元ファイルがコピーされて "(元ファイル名).orig" のファイル名でバックアップファイルが作成される。
しかし、gitやsvnなどのバージョンコントロールの管理下のファイルに対しては、このバックアップファイルの作成が邪魔に思えていた。バージョンコントロール管理下にあるので元コードに戻すのは簡単だし、バックアップファイルを削除するという手間が発生するし。
ということで、バックアップファイルを作らない方法が欲しかった。

なお、 git apply --reject hoge.patch は長ったらしくてタイプが面倒で、使わずにいる。

説明

gnu patchには no-backup-if-mismatch というオプションがあり、
http://www.gnu.org/software/diffutils/manual/html_node/patch-Options.html
バックアップファイルの作成をしないでいてくれる。

便利化

「カレントディレクトリがgitリポジトリ内なら no-backup-if-mismatch オプションを付けてpatchコマンドを呼ぶ」を勝手にやってもらう。
以下の記述を.bashrcあたりに書く。

patch() {
  local additional_patch_options=""

  if which git >/dev/null && git rev-parse 2>/dev/null; then
    additional_patch_options="--no-backup-if-mismatch"
  fi

  $(which patch) "$additional_patch_options" "$@"
}

あとはこれまでどおりpatchコマンドを使えばよい。

カレントディレクトリがgit管理下かどうかの判断には http://memo.sugyan.com/entry/20120323/1332507609 を参照した。
カレントディレクトリがsvn管理下かどうかの判断方法がさくっと分からなかったので、svnのフォローは省略。
svn info のexit statusを見るのがいい?

備考

--no-backup-if-mismatch はgnu patchで対応しているオプションのようなので、gnu版でないpatchコマンドでは--no-backup-if-mismatchが対応してなかったりバックアップファイル生成の挙動が異なったりするかもしれない。
例えばFreeBSDのpatchコマンドでは--no-backup-if-mismatchに対応してないらしい。
https://github.com/drush-ops/drush/issues/1502

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0