天地有情

[Windows][diff][patch] Windows用の diff & patch コマンドでのパッチの適用 ~備忘録~

Windows用の diff & patch コマンドでのパッチの適用 ~備忘録~

§1.概要

diff/patchコマンドを使うとファイルの変更を別のファイルに簡単に適用できます.

今回,使用した diff/patch コマンドのバージョンは次の通りです.

  diff.exe ーーー ”diff - GNU diffutils version 2.7”
  patch.exe ーーー”patch 2.5.4”

§2.作業手順

パッチ作業は次の順で行います.

  1)diffコマンドで変更前/後ファイルの 差分(パッチ)ファイル を作成
  2)変更前ファイルに対して patchコマンド で 差分(パッチ)ファイル を適用

§3.コマンド説明

コマンドについて説明します.

● diff --help で詳細を確認できます.
  オプションとしては通常,「-u」または「-c」が使われます.
   「-u」は unified 形式で出力.
   「-c」は context 形式で出力.

● patch --help で詳細を確認できます.
  オプションとしては通常,「-u」「-c」が使われます.意味は diff の場合と同じです.
  対象がカレント・ディレクトリの場合は,-uオプション以外は使わなくてもよいと思われます.

§4.差分(パッチ)ファイルの作成とパッチ(patch)の適用

  1)パッチファイルの作成には diff コマンドを使用します.

   diff -u(または -c) 変更前ファイル名  変更後ファイル名 > 差分(パッチ)ファイル名

※ -u(または -c)オプションを付けると,差分(パッチ)ファイル自体にパッチの対象となる
  ファイルの情報が含まれます.次項で述べる patch コマンドでは,わざわざユーザが
  変更前ファイル名を指定する必要はありません.

  2)patchコマンドの適用

   patch [-u(または -c)] [適用するファイル名] < パッチファイル名

※ [適用するファイル名]は前述のとおり省略できます.パッチファイルの情報として,
  先頭の行「--- ファイル名」のファイルにパッチが適用されます.

※ 【重要なこと】パッチファイル名 の改行コードは 標準では[LF]となっています.
         Windowsの場合は必ず[CRLF] に変更します.
         もし,変更しなかった場合は次のようなメッセージが出て失敗します.

*************************************************************
missing header for unified diff at line 4 of patch
can't find file to patch at input line 4
Perhaps you should have used the -p or --strip option?
File to patch:
*************************************************************


§5.簡単なサンプル

例として以下のような2ファイル(test,test.new)を元にパッチファイルを作成してみます.

1)サンプルファイルの作成

■ test ファイル(変更前ファイル)
-----------------------------
1.あいうえお   %%「か」行なし
2.さしすせそ
3.たちつてと   %%「な」行なし
4.はひふへほ
5.まみむめも

-----------------------------

■ test.new ファイル(変更後ファイル)
-----------------------------
1.あいうえお
2.かきくけこ
3.さしすせそ
4.たちつてと
5.なにぬねの
6.はひふへほ   %%「ま」行なし

-----------------------------

※ 【重要なこと】各ファイルの[最終行]は改行してから,保存します.

2)操作

    diff -u test test.new > test.patch
 
    出力された test.patch の改行コードを[CRLF]に変更しておきます.
 次に,
    patch -u < test.patch

test.patch の内容
※ ファイルの見方の説明は §6.補足説明 を参照してください.
---------------------------------------
--- test Fri Mar 07 12:40:59 2014
+++ test.new Fri Mar 07 12:41:08 2014
@@ -1,5 +1,6 @@
1.あいうえお
-2.さしすせそ
-3.たちつてと
-4.はひふへほ
-5.まみむめも
+2.かきくけこ
+3.さしすせそ
+4.たちつてと
+5.なにぬねの
+6.はひふへほ
---------------------------------------

3)パッチ後の元のファイル test の内容

---------------------------------------
1.あいうえお
2.かきくけこ
3.さしすせそ
4.たちつてと
5.なにぬねの
6.はひふへほ
---------------------------------------

※ 上記の更新された test の内容を 変更前ファイル に戻したい場合には次の 「-R 」オプションを使います.

  patch -R < test.patch

§6.補足説明

パッチファイル test.patch の見方について説明します.

1行目: --- test は変更前(比較元)ファイル名と,そのファイルの作成日付である.

2行目: +++ test.new は変更後(比較先)ファイル名と,そのファイルの作成日付である.

3行目: @@ -R +R @@
     変更箇所の範囲情報は2つの範囲についての情報を含んでいる.一方はマイナス記号が頭に
     付いた元ファイルにおける変更箇所を示すものであり,もう一方はプラス記号が頭に付いた
     変更後のファイルにおける変更箇所を示している.範囲を示す R は l,s という形式となり,
     l は変更箇所の開始行,s はそれぞれのファイルにおける変更箇所の行数を示している.

4行目以降: 中盤の部分が比較しているテキストで,その中の「-」および「+」がついている行は
    二つのファイの相違点である.さらに冒頭の二行に「---」および「+++」が付加されている
    ことから類推すれば,「-」がついている行は比較元のファイルにのみ存在する行であること,
    逆に「+」が付加されている行は比較先にのみ存在する行であることがわかる.
    頭に何も書かれていない行は両者に共通している行である.

この項は(http://d.hatena.ne.jp/den8/20100622/1277226958)を参考にしました.

--おわり--
スポンサーサイト
  1. 2014/03/07(金) 15:44:39|
  2. 便利ツール
  3. | トラックバック:0
  4. | コメント:0
<<[LaTeX][LuaLaTeX]  PDF「日本語しおり」の作り方 ~備忘録~ | ホーム | [elapsedtime][timeit] プログラム実行時間の計測コマンド >>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://konoyonohana.blog.fc2.com/tb.php/67-140a4b97
この記事にトラックバックする(FC2ブログユーザー)