パッチファイル

プログラムにバグがある場合、それを修正したプログラムを作ります。 両者の diff をとったのがパッチファイルです。 パッチファイルは、コマンド patch を用いることにより、 古いファイルを新しいファイルに直すことができます。


例のファイル

例として、次の2つのファイルを考えます。 修正したファイルは、 元のファイルよりも長い名前をつけておきます。

test
  one
  tuo         (←スペルミス)
  three
  four
  five
  seven       (←six が抜けている)
  eight
  nine
  ten
test.new
  one
  two         (←スペルが直っている)
  three
  four
  five
  six         (←six が入った)
  seven
  eight
  nine
  ten

パッチ の作り方

コマンド diff のオプションを用いて、 test を test.new に修正するためのパッチを作ります。 共に、違いのある行の前後3行を含めて違いを表示します。

その1
  % diff -c test test.new > test.patch (名前はなんでもよいです)
  % cat test.patch
  *** test        Sat Apr 15 00:59:53 2000
  --- test.new    Sat Apr 15 00:43:59 2000
  ***************
  *** 1,8 ****
    one
  ! tuo
    three
    four
    five
    seven
    eight
    nine
  --- 1,9 ----
    one
  ! two
    three
    four
    five
  + six
    seven
    eight
    nine

その2
  % diff -u test test.new > test.patch (名前はなんでもよいです)
  % cat test.patch
  --- test        Sat Apr 15 00:59:53 2000
  +++ test.new    Sat Apr 15 00:43:59 2000
  @@ -1,8 +1,9 @@
   one
  -tuo
  +two
   three
   four
   five
  +six
   seven
   eight
   nine

さらに詳しいオプションについては、man diff を参照してください。

パッチ の当て方

パッチ当ては、コマンド patch を使います。 patch は *** 、--- もしくは +++ の行のファイルのうち、 名前の短い方にパッチを当てようとします。 したがって、修正ファイル名は元ファイル名よりも 長くしておきます。 test, test.new のあるディレクトリにいき、 次のようにします。
  % ls
  test test.new test.patch
  % patch < test.patch
  % ls
  test test.new test.orig test.patch
  % diff test test.new
  %
  

パッチ の当て方 II

場合によっては、ファイルのあるディレクトリではない場所で パッチファイルを作ることもあるでしょう。 そのような場合、パッチファイルの先頭のファイル名は、 相対パスコミの表示になります。

例えば、/somewhere にいて、 /somewhere/dir1/dir2/dir3/dir4/test と /somewhere/dir1/dir2/dir3/dir4/test.new の パッチファイル test.patch を作ると、
  % pwd
  /somewhere
  % diff -c dir1/dir2/dir3/dir4/test dir1/dir2/dir3/dir4/test.new
  *** dir1/dir2/dir3/dir4/test        Sat Apr 15 00:59:53 2000
  --- dir1/dir2/dir3/dir4/test.new    Sat Apr 15 00:43:59 2000
  ....
となります。これを、いろんな場所でパッチを当てるには -p オプションを使います。例えば、-p2 はパッチファイル中の ファイル名の中から、2つの / を消去し、 dir3/dir4/test と読み変えます。

/somewhere で当てる
% patch < test.patch
/somewhere/dir1 で当てる
% patch -p1 < test.patch
/somewhere/dir1/dir2 で当てる
% patch -p2 < test.patch
/somewhere/dir1/dir2/dir3 で当てる
% patch -p3 < test.patch
/somewhere/dir1/dir2/dir3/dir4 で当てる
% patch -p4 < test.patch

さらに詳しいオプションについては man patch を参照してください。 なお、-p がオプションで一致する2つ以上のパッチファイルは 後ろにつなげて行ってひとつのパッチファイルとすることができます。 当て方は上と同様です。


FreeBSD の部屋


Apr. 1, 2000