Linux下patchファイルの作成

3685 ワード

まずはdiffとpatchをご紹介します.ここではmanオンラインドキュメント上のすべてのオプションを紹介することはありません.そうする必要はありません.99%の時間で、私たちはいくつかの選択肢しか使いません.これらの選択肢を学ばなければなりません  

1.diff

    NAME
           diff - find differences between two files
    SYNOPSIS
           diff [options] from-file to-file

簡単に言えば、diffの機能は、2つのファイルの違いを比較して記録する、いわゆるdiffパッチです.構文フォーマット:diff【オプション】ソースファイル(クリップ)の目的ファイル(クリップ)は、ソースファイル(クリップ)にパッチを適用して目的ファイル(クリップ)にすることであり、用語は「アップグレード」である.次の3つの最も一般的なオプションについて説明します.
-rは再帰的なオプションです.このオプションを設定すると、diffはサブディレクトリファイルを含む2つの異なるバージョンのソースコードディレクトリの対応するファイルをすべて比較します.-Nオプションでは、作成または削除されたファイルがパッチファイルで正しく処理されることを確認します.-uオプションは、デフォルトフォーマットよりもコンパクトなパッチファイルを統一フォーマットで作成します.

2、patch

NAME
       patch - apply a diff file to an original
    SYNOPSIS
           patch [options] [originalfile [patchfile]]
           but usually just
           patch -pnum <patchfile>

簡単に言えばpatchはdiffで作成したパッチを用いてソースファイル(クリップ)と宛先ファイル(クリップ)の変換を実現する.これは、アクティブなファイル(クリップ)——>宛先ファイル(クリップ)、宛先ファイル(クリップ)——>ソースファイル(クリップ)を意味します.次に、最も一般的なオプションについて説明します.-p 0オプションは、現在のディレクトリから目的のファイル(クリップ)を検索します.-p 1オプションは、最初の階層ディレクトリを無視し、現在のディレクトリから検索します.
ここでは例として説明します.-old/modules/pcitable Mon Sep 27 11:03:56 1999++new/modules/pcitable Tue Dec 19 20:05:41 2000パラメータ-p 0を使用すると、現在のディレクトリからoldというフォルダを探し、その下にmodulesの下のpcitableファイルを探してpatch操作を実行することを意味します.パラメータ-p 1を使用すると、第1階層ディレクトリ(すなわちoldにかかわらず)を無視し、現在のディレクトリからmodulesのフォルダを探し、その下にpcitableを探すことを意味します.このような前提は、現在のディレクトリがmodulesが存在するディレクトリである必要があることです.diffパッチファイルは、diffパッチファイルのパスが指定されている限り、任意の場所で使用できます.もちろん、相対パスでも絶対パスでも構いません.しかし、私は一般的に相対経路を使うことに慣れています.
-Eオプションの説明空のファイルが見つかった場合は、それを削除します-Rオプションの説明パッチファイルの「新しい」ファイルと「古い」ファイルを交換します(実際には新しいバージョンにパッチを適用して古いバージョンにします)

3.例説明


3.1単一ファイルに対するパッチ処理
diff –uN from-file to-file >to-file.patch
patch –p0 < to-file.patch
patch –RE –p0 < to-file.patch

3.2フォルダへのパッチ適用
diff –urN old_docu/  new_docu/ > new_docu.patch
patch -p1 -d old_docu < new_docu.patch

原理説明:
まず、old_に基づいているとします.docu/ディレクトリは古いディレクトリ、new_docu/は新しいディレクトリでnew_docuの下にファイルが新しく作成されましたfile 2、あなたが作ったpatchはこのようにしています.
--- old_docu/file2
+++ new_docu/file2
+this is file 2

もしあなたがpatch-p 0でこのpatchを打つならば、パッチはまず解決しなければならない問題は、どこにこのパッチを打つかです.まず、+++が与えるパスを探します.明らかに-これは見つかりませんでした.+++これは見つかりました.次のプロンプトが表示されます.
The next patch would create the file new_docu/file2,
which already exists!  Assume -R? [n]

yを押すとrevert操作を実行することになりますnew_docu/file 2がなくなりました.ここでは-p 0は使えません-p 1-d old_を使うべきですdocu/は、パッチを自分で探すのではなく、patchするパスを手動で指定します.