2011年2月14日月曜日

Linuxでのパッチの作り方(diff)と使い方(patch)

パッチはどういうときに役立てるのか、自分的なメモです。

diffコマンドの詳細解説
http://x68000.q-e-d.net/~68user/unix/pickup?diff
patchコマンドの詳細解説
http://x68000.q-e-d.net/~68user/unix/pickup?patch

実際使うとしたら、大体以下の2通りぐらいかなと

単一ファイルに対するパッチ
1つ目のパターンは、一つのファイルに対するパッチを作成したいというとき。
例えば何か修正を行う前に元々のファイルを別名でコピーしておいて、修正内容に対する差分パッチを作りたいというような場合です。

この場合には、上の図でいうとworkspace/work/src/ディレクトに移動してdiffコマンドによるパッチを作成しましょう。
$ cd workspace/work/src
$ diff -u main.c.orig main.c > main.patch

適用する場合は同じくパッチ適用対象のディレクトリにて、
$ patch < main.patch
※パッチを適用し修正済みの状態にする。

あるいはリバースパッチを当てたいときは
$ patch -R < main.patch
※パッチ適用済みのものをパッチ適用前の状態に戻す。


なお、パッチを当てたいファイルのあるディレクトリに移動せずとも、patchの引数でパッチを当てたいファイルを指定することもできる。
例えば、workspace/backup/src/main.cにパッチを当てたければ
$ patch workspace/backup/src/main.c < main.patch


ディレクトリに対するパッチ
2つ目は、元々のソースコード群が入っているディレクトリごとコピーして、開発用のソースコード群として修正していったという場合です。


この場合はworkspaceディレクトリに移動して、ディレクトリを対象にパッチを作成しましょう。
$ cd workspace
$ diff -ur trank/ develop/ > sources.patch

trankディレクトリ以下のソースにパッチを当てる際は、workspace/trankディレクトリに移動して
$ cd workspace/trank
$ patch -p1 < ../sources.patch


リバースパッチを当てる場合も同様に
$ patch -p1 -R < ../sources.patch


なお、-dオプションでパッチを適用するディレクトリを指定することができる。例えばworkspace/trankディレクトリではなくworkspaceディレクトリでパッチ作業を行う場合は
$ cd workspace
$ patch -p1 -d trunk < sources.patch

ついでにさらにworkspace/trank/srcでパッチを当てたいという場合には
$ cd workspace
$ patch -p2 -d trunk/src < sources.patch


こんなもんかな。

0 件のコメント:

コメントを投稿