diffコマンドとpatch(パッチ)の適応

diffコマンドとpatch(パッチ)の適応についてのメモ。

マスターのソースに修正を加える場合、修正後のファイルを送る場合とパッチのみを送る場合があります。逆にもらう場合もあります。で使い方。

diffコマンド

ほとんど下のオプションのみ知っていればOKかと。diffで差分だけを見たいときはオプションなしでもほとんど問題なし。
オプション内容
-cコンテキスト形式(context format)の出力
-uユニファイド形式(unified format)の出力
-rサブディレクトリ以下もリカーシブにdiffを実行

unified形式の例(個人的にはこれが一番見やすくて好きです)
--- org.php     2012-02-26 07:45:02.000000000 -0600
+++ mod.php     2012-02-26 07:45:04.000000000 -0600
@@ -1,8 +1,7 @@
 #!/usr/local/bin/php
 <?php

-$prm_opts = getopt ("a:");
+$prm_opts = getopt ("a:b:");

 print "*** a=". $prm_opts["a"] . "\n";
-
-// EOF
+print "*** b=". $prm_opts["b"] . "\n";

patchコマンド

patchコマンドはオリジナルに直接更新をかけるので、バックアップか出力先を指定して実行した方がよい。
また、修正にパッチファイルだけを渡される場合があるのですがレビューなどをする場合はパッチとパッチ適用後両方のファイルを渡したほうが親切です。
オプション内容
-cパッチファイルがコンテキスト形式の場合指定(なくても可)
-uパッチファイルがユニファイド形式の場合指定(なくても可)
-bバックアップファイルを作成する
-oパッチを適用した新しいファイルを指定されたファイルに出力する

実行例は下記に。

diffからパッチの適応例

オリジナルファイルを更新後ファイルのように修正した場合のパッチファイル作成からオリジナルファイルへの適用例。
オリジナルファイル:org.php
#!/usr/local/bin/php
<?php

$prm_opts = getopt ("a:");

print "*** a=". $prm_opts["a"] . "\n";

// EOF

更新後のファイル:mod.php
#!/usr/local/bin/php
<?php

$prm_opts = getopt ("a:b:");

print "*** a=". $prm_opts["a"] . "\n";
print "*** b=". $prm_opts["b"] . "\n";

1. パッチファイルの作成
まず、diffコマンドでpatchコマンド用のパッチファイルを作成。-cまたは-uでdiffの結果に対象のファイル情報を含んだdiffの出力結果をpatchファイルとして保存。
user01@pc01[tmp1]$ diff -u org.php mod.php > org.patch
user01@pc01[tmp1]$ cat org.patch
--- org.php     2012-02-26 07:45:02.000000000 -0600
+++ mod.php     2012-02-26 07:45:04.000000000 -0600
@@ -1,8 +1,7 @@
 #!/usr/local/bin/php
 <?php

-$prm_opts = getopt ("a:");
+$prm_opts = getopt ("a:b:");

 print "*** a=". $prm_opts["a"] . "\n";
-
-// EOF
+print "*** b=". $prm_opts["b"] . "\n";

2-1. パッチの適用(出力先を指定-o)
指定した新しいファイルにパッチ適用後のファイルが作成される。
user01@pc01[tmp1]$ patch -o org.php.new < org.patch
patching file org.php
user01@pc01[tmp1]$ cat org.php.new
#!/usr/local/bin/php
<?php

$prm_opts = getopt ("a:b:");

print "*** a=". $prm_opts["a"] . "\n";
print "*** b=". $prm_opts["b"] . "\n";

2-2. パッチの適用(バックアップ作成あり)
org.php.orig という名前でパッチ適用前のバックアップファイルが作成される。
user01@pc01[tmp1]$ patch -b < org.patch
patching file org.php
user01@pc01[tmp1]$ l
total 16
-rwxrwxrwx 1  136 Feb 26 07:45 mod.php
-rw-r--r-- 1  293 Feb 26 07:47 org.patch
-rwxrwxrwx 1  136 Feb 26 08:00 org.php
-rwxrwxrwx 1  103 Feb 26 07:45 org.php.orig
user01@pc01[tmp1]$ cat org.php
#!/usr/local/bin/php
<?php

$prm_opts = getopt ("a:b:");

print "*** a=". $prm_opts["a"] . "\n";
print "*** b=". $prm_opts["b"] . "\n";
user01@pc01[tmp1]$ cat org.php.orig
#!/usr/local/bin/php
<?php

$prm_opts = getopt ("a:");

print "*** a=". $prm_opts["a"] . "\n";

// EOF

関連記事

Comment

(編集・削除用)
管理者にだけ表示を許可

Trackback

URL
https://nosource.blog.fc2.com/tb.php/69-6272d5d9
この記事にトラックバック(FC2Blog User)

カテゴリ

Amazon

アクセスランキング

[ジャンルランキング]
コンピュータ
261位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
47位
アクセスランキングを見る>>

RSSリンクの表示

ブロとも申請フォーム

Copyright © nopgm