diff patch 命令用法

2021-05-27 03:14:22 字數 4376 閱讀 1658

我們可以用下面的命令建立patch檔案:

$diff -c week week.new > week.patch

建立好的week.patch如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

*** week    2010-04-17 18:10:14.000000000 +0900

--- week.new    2010-04-17 18:10:14.000000000 +0900

***************

*** 1,7 ****

sunday

! monkeyday

tuesday

wednesday

thursday

saturday

- sunday

--- 1,7 ----

sunday

! monday

tuesday

wednesday

thursday

+ friday

saturday

或者我們還可以用下面的命令建立更簡潔的patch檔案:

$diff -u week week.new > week.patch

這次建立好的week.patch是這樣的:

1

2

3

4

5

6

7

8

9

10

11

12

--- week    2010-04-17 18:10:14.000000000 +0900

+++ week.new    2010-04-17 18:10:14.000000000 +0900

@@ -1,7 +1,7 @@

sunday

-monkeyday

+monday

tuesday

wednesday

thursday

+friday

saturday

-sunday

第一種格式是把整個檔案分列上下兩部分,分別表示它們的區別。

第二種格式僅把整個檔案中不同的地方表示出來,縮小了patch檔案的尺寸。

無論是使用-c還是-u選項,它們都會預設記錄包括差異在內的至少3行資訊。

那是因為:patch需要起碼2行資訊,才能夠在目標檔案中準確找出需要打補丁的位置。

接下來就是使用patch了。

$patch < week.patch

執行了這條命令後,week檔案就和week.new檔案完全一致了。

需要注意的是,patch命令一般不指定檔名。

patch命令參照patch檔案中記錄的檔名來決定對哪個檔案打補丁。

並且,patch會選擇檔名較短的那個檔案作為操作物件。

所以在進行diff前,必須特意對最新的檔案賦予相對更長的檔名。

有時候,製作patch檔案時所處的目錄和執行patch時所處的目錄並不一致。

例如,在乙個開發專案中,為了方便管理,patch檔案被統一製作在專案的某個目錄下。

$pwd

/users/bear/program/patch_test

$ls -r

workdir

./workdir:

week        week.new

$diff -u workdir/week workdir/week.new > week.patch

$cd workdir

此時,我們在workdir目錄下。該目錄下有我們需要打補丁的檔案week,並且補丁檔案week.patch在上一級目錄。

我們可以用-p開關來告訴patch,當看到patch檔案內的目標檔案時,應該從第幾級目錄開始操作。

patch檔案的內容如下:

1

2

3

4

5

--- workdir/week        2010-04-17 20:24:14.000000000 +0900

+++ workdir/week.new    2010-04-17 20:24:14.000000000 +0900

@@ -1,7 +1,7 @@

sunday

...

而patch命令應該這樣執行:

$patch -p1 < ../week.patch

-p後面的1就是告訴patch,當看到patch檔案中的workdir/week時,忽略第一級目錄workdir,而將week作為patch操作的目標檔案。

當你有多級目錄的時候,就可以根據所處目錄的層級,任意調整-p後的數字,完成對目標檔案的補丁操作了。

patch a c 就能得到b, 這一步叫做對a打上了b的名字為c的補丁。如果你打完補丁之後想恢復到a怎麼辦呢?patch -r b c 就可以重新還原到a了,所以不用擔心會失去a的問題。舉例如下,a檔案在 dir_a下,修改後的b檔案在dir_b下,一般dir_a和dir_b在同一級目錄。我們為了對整個目錄下的所有檔案一次性diff,我們一般會到dir_a和dir_b的父目錄下執行以下命令

diff -rc dir_a dir_b >c

這個時候補丁檔案c中會記錄了原始檔案的路徑為 dir_a/a

現在另乙個使用者得到了a檔案和c檔案,其中a檔案所在的目錄也是dir_a。 一般,他會比較喜歡在dir_a目錄下面進行patch操作,它會執行

patch

但是這個時候patch分析c檔案中的記錄,認為原始檔案是./dir_a/a,但實際上是./a,此時patch會找不到原始檔案。為了避免這種情況我們可以使用-p1引數如下

patch -p1

此時,patch會忽略掉第1個」/」之前的內容,認為原始檔案是 ./a,這樣就正確了。

最後有以下幾點注意:

1. 一次打多個patch的話,一般這些patch有先後順序,得按次序打才行。

2. 在patch之前不要對原檔案進行任何修改

3. 如果patch中記錄的原始檔案和你得到的原始檔案版本不匹配(很容易出現),那麼你可以嘗試使用patch, 如果幸運的話,可以成功。大部分情況下,會有不匹配的情況,此時patch會生成rej檔案,記錄失敗的地方,你可以手工修改。

參考文獻

linux下patch的製作和應用

diff patch命令的使用

如何打補丁?一 檔案patch 首先製作patch檔案包括file1.txt和file2.txt 兩個檔案的對比 檔案1 file1.txt 檔案2 file2.txt 用法 diff run file1.txt file2.txt file.diff 則生成了乙個 file2 相對 file1 的...

如何優雅的生成乙個 diff patch

某天如果你要把一條 git 或 svn 記錄的修改傳送給其他人時我們要怎麼做呢?在 git 下你可以這麼做 git format patch commit sha1 id 1這樣會生成單條記錄的 patch 檔案,當然也可以生成多條或者兩條 commit 記錄之間的修改。例如我們在開源專案 nukl...

at 命令用法

at命令的用法 at列出在指定的時間和日期在計算機上執行的已計畫命令或計畫命令和程式。必須正在執行 計畫 服務才能使用 at 命令。at computername id delete delete yes at computername time interactive every date nex...