細かいところとかが結構「あれれ?」となりやすいので、patchの使い方を今一度自分用にメモ。
patchコマンドはカレントディレクトリのソースツリーに対して処理する。
patch < patchfile
# タブやスペースマッチの条件を緩めにする patch -l < patchfile
# パッチ適用ファイルに対して".orig"拡張子をつけてバックアップする。 patch -b < patchfile
"-b"によるバックアップファイルの拡張子を変更するには・・・
GNUの場合: patch -b -z .bk < patchfile FreeBSDの場合: patch -b .bk < patchfile
"-d ディレクトリ名"を指定すると、そのディレクトリに移動してから処理が始まる。
patchを実行する前に、「何が行われるのか確認だけしたい」場合は以下のオプションを使う。
GNUの場合: patch ... --dry-run ... < patchfile FreeBSDの場合:(-C or --check) patch ... -C ... < patchfile
patchを実行する時に個人的に極めて重要だと考えているオプションが "-pNum" オプションである。
"-pNum"を使うと、patchfileで見つかったファイル名それぞれについてNum個のスラッシュとその間のディレクトリ名を除去する。
patchfile中のファイル名が
proj-0.0.1/src/foo/bar/main.c
であったとすると、以下のように調整される。
個人的な経験として、Linuxに触りだした当時、雑誌記事を見つつソースコードを弄っていた時"-p"オプションの意味を知らずにpatchを無理矢理あててしまい、ソースコードがぐちゃぐちゃになってしまった事がある。
patchファイルを作成した人の環境と、自分の環境は必ず異なるので、"--dry-run/-C/--check"を活用して丁寧に確認してからpatchを適用するよう心がけたい。
"-R"は本来の意味としては「patchfileの中の新旧が逆でした~」というpatchを当てたい時に使う。
しかし見方を変えれば、旧→新で作られた正常なpatchfileを「新→旧へのロールバック用patch」として処理する事を意味する。
従って、パッチ適用後にパッチに間違いが発見され、ロールバックしたい場合は、適用時のオプションに "-R" を加えるだけで適用前の状態にロールバックできる。
$ patch -p1 < foobar.patch ↓ロールバックしたい・・・ $ patch -p1 -R < foobar.patch
なお、ed形式のpatchファイルについては必要な情報が不足している為、"-R"オプションは使えない。
Linux jman, FreeBSDのmanページ共に「パッチを送る人への注意」「パッチ作成者への注意」という項目があり、参考になる。
コメント