解析linux patch

3259 ワード

Patchの主な用途は、コードにパッチを適用したり、既知のエラーを修正したり、デバッグ手段として問題のあるコードをデバッグしたり、問題を発見したり、修正の結果を検証したりすることです.
Patchプロセスは3つの大きなステップに分けられます.1つはdiffツールで新しいコードと古いコードを比較し、patchファイルを生成することです.二つ目はpatchコマンドを使用して、patchファイルを元のコードにマージすることです.3つ目は、patchできないファイルがあるかどうかを確認し、patchをするかどうかを変更または再選択することです.patchが終わったら直接コンパイルできます.
patchに対応する主なコマンドは2つあり、diffとpatchです.チェック結果については、linux環境でlsコマンドまたはfindコマンドを使用してrejタイプのファイルがあるかどうかを確認すればいいです.
現実的によく見られる方法は、makefileにpatchコマンドを追加し、コンパイル中にコードのpatchを作成し、コードをコンパイルすることです.
diffコマンドの一般的なオプション
次のコマンドを例に挙げます.
   $:diff -uNr orginal_proj updated_proj > test.patch 

ここで、-uはunified output formatを用いて、出力フォーマットを統一し、比較的コンパクトで読みやすいことを示す.
-N新規ファイルの処理に使用します(この場合パラメータはディレクトリに対応します)
-rは、すべてのサブディレクトリを再帰的に処理することを示す.
コマンド全体の意味は、originalとupdatedの2つのプロジェクトのすべてのファイルを再帰的に比較し、統一的な出力フォーマットを使用して、新しいファイルを追加し、結果をtestに出力することです.patchファイルにあります.
その他の一般的なオプションは、-pがCプログラムに対してのみ有効であり、それぞれの異なる対応する関数を表示します.-i大文字と小文字を無視し、htmlファイルなど、大文字と小文字に敏感でない場合に使用します.–excludeは、コードにcvsディレクトリが含まれている場合など、ファイルやディレクトリを除外し、比較しないことを示します.残りの他のパラメータはinfoまたはhelpまたはmanを参照できます.
patchファイルのフォーマット
前の例で生成したファイルは統一出力フォーマットで、比較的コンパクトで読みやすい.例を挙げると、##は私が加えた注釈です.
   --- autoconf-2.7/acgeneral.m4 Wed Nov 22 11:42:00 1995     ##    
   +++ autoconf-2.9/acgeneral.m4 Sat Mar 16 15:53:07 1996    ##    
   @@ -1,7 +1,7 @@   ##          ,    1   , 7 ;    1   , 7 
   dnl Parameterized macros.  ##  +—  ,      
   dnl Requires GNU m4.
   dnl This file is part of Autoconf.
   -dnl Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.  ##      
   +dnl Copyright (C) 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. ##      
   dnl
   dnl This program is free software; you can redistribute it and/or modify
   dnl it under the terms of the GNU General Public License as published by
   @@ -51,7 +51,7 @@     ##        
   divert(-1)dnl Throw away output until AC_INIT is called.
   changequote([, ])
   -define(AC_ACVERSION, 2.7)
   +define(AC_ACVERSION, 2.9)
   dnl Some old m4′s don’t support m4exit. But they provide
   dnl equivalent functionality by core dumping because of the

さっきのdiffコマンドの例から、1つのpatchファイルには、プロジェクト全体のすべての異なるファイルの比較結果が含まれる可能性があります.そのため、特定のファイルパスとファイル名、および単一のファイルの複数の異なる点を区別する必要があります.統一出力フォーマットでは、---を使用して古いファイルを表し、+++を使用して新しいファイルを表す.ファイル内の複数の異なるテキストまたはコードセグメントは、@@で始まり、@@で終わる行で始まります.中央の内容は、新旧ファイルの開始行数と、このセグメントの比較に含まれる関数で、スペースが区切られています.各セグメントでは、-+記号のない行が参照され、-番号のある行が削除され、+番号のある行が追加されます.これでこれらの状況を区別することができます.
diffコマンドは、非統一フォーマットのpatchファイルを生成することもできますが、可読性が非常に悪いので、プログラミングの観点からunified output formatを使用するのが合理的に違いありません.ここでは説明しませんが、興味のあるdiffファイルの-cオプションを使って生成してみてください.ネット上でも紹介されています.
patchコマンド共通オプション
次のコマンドを例に挙げます.
   $:patch -lNp0 < test.patch

ここで、-lの意味–ignore-whitespace、空白文字を無視します.-Nは-forwardを表し、すでに打ったパッチまたはキャンセルしたパッチ(ignore patches that seem to be reversed or already applied)を無視します.-pnumは–strip=numを表し、numパラメータがなければファイル名を直接使用することを表し、0は全パス名を表し、その他は左からいくつかのslashを除去して、どのレベルのディレクトリ(cut slash count)を表す.
命令全体の意味はtestを使うことです.patchファイルは入力として、空白記号と処理されたパッチを無視し、patchファイルに含まれるファイルのフルパス名を保持し、patchファイルに関連するファイルにパッチを適用します.
他の一般的なオプションは、-i一般的なコマンドラインのリダイレクトの代わりに使用するpatchファイル名を指定します.-Rパッチを反転(キャンセル)します.その他はヘルプを表示できます.