Ted's Blog

Happy coding

製作patch, 使用patch的方法


製作patch
diff -Naur olddir newdir > new-patch



製作patch要注意的事項
記得要讓前置的目錄階層數有相同的深度,例如:

--- old/modules/pcitable Mon Sep 27 11:03:56 1999
+++ new/modules/pcitable Tue Dec 19 20:05:41 2000

上面用diff產生的結果,可以給patch使用

--- old/try1/other/modules/pcitable Mon Sep 27 11:03:56 1999
+++ new/modules/pcitable Tue Dec 19 20:05:41 2000

但是上面產生的結果在使用上可能會發生問題,第一行目錄的深度有四層,而第二行只有兩層. 這裡建議直接修改 ---和+++後面的內容讓目錄結構有相同的深度.

使用Patch命令
patch -p0 < new-patch
patch -p1 < new-patch

這兩個命令的差異在於目前工作目錄的不同

另外一種用法是讓patch 從標準輸入讀取資料:

cat new-patch | patch -p0

還有一種用法是讓patch 讀取 "here document"的方式

( 省略此種方法之舉例 )

Patch指令的階層 ( -p0 和 -p1 的差別 )

假設patch的表頭如下

--- old/modules/pcitable Mon Sep 27 11:03:56 1999
+++ new/modules/pcitable Tue Dec 19 20:05:41 2000

使用 -p0 , patch會期待在你目前的工作目錄下有一個名為new的目錄, 接著會有modules目錄, 然後是pictable目錄

使用 -p1 , 路徑的第一層會被拿掉, 也就是patch期待工作目錄下有 modules目錄, 然後是pictable目錄

-p2, -p3, .... 以此類推


Patch使用方法

Patch表頭
開頭是 ---, +++, 並且接著被比較的檔案

同個patch檔包含多個patch

瀏覽patch檔的方法

less /tmp/file-patch
/---
n
n
n

( /--- 會搜尋---,而n會搜尋下個出現的--- )

Hunk
每個patch的段落稱作 Hunk,每個段落皆以兩個老鼠記號 ( @@ ) 開始, 直至下個段落開始,或者下個patch header為止