基於linux的patch生成及使用方法

2021-07-30 05:25:52 字數 4798 閱讀 6765

old.txt為原檔案,new.txt 為已修改後的檔案,現在要做的是:製作patch,更新old.txt檔案

[wln@localhost 02]$ cat old.txt 

123456

qwert

dasfg

fdsaf

[wln@localhost 02]$ cat new.txt 

1123456

qqwert

dasfg

dsaf

[wln@localhost 02]$ 

diff -naur old.txt new.txt > a.patch 

[wln@localhost 02]$ cat a.patch 

--- old.txt     2014-06-09 15:35:34.000000000 +0800

+++ new.txt     2014-06-09 15:35:34.000000000 +0800

@@ -1,4 +1,4 @@

-123456

-qwert

+1123456

+qqwert

dasfg

-fdsaf

+dsaf

-n 選項確保補丁檔案將正確地處理已經建立或刪除檔案的情況

-a  將所有檔案都當做文字檔案

-u 選項以統一格式建立補丁檔案,這種格式比預設格式更緊湊些

-r 是乙個遞迴選項,設定了這個選項,diff會將兩個不同版本源**目錄中的所有對應檔案全部都進行一次比較,包括子目錄檔案

[wln@localhost 02]$

patch -p0 < a.patch 

patching file old.txt

這裡 -p0表示執行patch所在的路徑就是製作patch所在的路徑。如果為-p1表示執行patch所在的路徑為製作patch所在路徑的子目錄下,如果為 -p2 則為子目錄的子目錄下。

所以最好是在**製作在**執行patch(用-p0)

[wln@localhost 02]$ cat old.txt 

1123456

qqwert

dasfg

dsaf

[wln@localhost 02]$ cat new.txt 

1123456

qqwert

dasfg

dsaf

[wln@localhost 02]$

patch -r -p0 < a.patch

patching file old.txt

[wln@localhost 02]$ cat old.txt 

123456

qwert

dasfg

fdsaf

[wln@localhost 02]$ cat new.txt 

1123456

qqwert

dasfg

dsaf

[wln@localhost patch]$ ll

總計 8

drwxrwxr-x 3 wln wln 4096 06-09 15:48 new

drwxrwxr-x 3 wln wln 4096 06-09 15:48 old

[wln@localhost patch]$ tree

.|-- new

|   `-- a

|       |-- a.txt

|       `-- b

|           `-- foo.txt

`-- old

`-- a

`-- b

`-- foo.txt

[wln@localhost patch]$ cat old/a/b/foo.txt 

old_line_1

old_line_2

12324

[wln@localhost patch]$ cat new/a/a.txt 

fdfas

fafes

1233

5678

2345

[wln@localhost patch]$ cat new/a/b/foo.txt 

new_line_1

new_line_2

[wln@localhost patch]$ diff -naur old new > a.patch

[wln@localhost patch]$ cat a.patch 

diff -naur old/a/a.txt new/a/a.txt

--- old/a/a.txt 1970-01-01 08:00:00.000000000 +0800

+++ new/a/a.txt 2014-06-09 15:48:45.000000000 +0800

@@ -0,0 +1,5 @@

+fdfas

+fafes

+1233

+5678

+2345

diff -naur old/a/b/foo.txt new/a/b/foo.txt

--- old/a/b/foo.txt     2014-06-09 15:48:49.000000000 +0800

+++ new/a/b/foo.txt     2014-06-09 15:48:45.000000000 +0800

@@ -1,3 +1,2 @@

-old_line_1

-old_line_2

-12324

+new_line_1

+new_line_2

[wln@localhost patch]$ cd old/

[wln@localhost old]$ patch -p1 < ../a.patch 

patching file a/a.txt

patching file a/b/foo.txt

[wln@localhost old]$ cd ../

[wln@localhost patch]$ tree

.|-- a.patch

|-- new

|   `-- a

|       |-- a.txt

|       `-- b

|           `-- foo.txt

`-- old

`-- a

|-- a.txt

`-- b

`-- foo.txt

6 directories, 5 files

[wln@localhost patch]$ cat old/a/a.txt 

fdfas

fafes

1233

5678

2345

[wln@localhost patch]$ cat old/a/b/foo.txt

new_line_1

new_line_2

[wln@localhost patch]$ cat new/a/a.txt 

fdfas

fafes

1233

5678

2345

[wln@localhost patch]$ cat new/a/b/foo.txt 

new_line_1

new_line_2

[wln@localhost patch]$ 

為什麼要進入到old/下執行patch?

因為有新檔案a/a.txt生成,如果直接在製作patch路徑執行patch,會產生問題。

假如沒有新檔案生成,可以直接在製作patch的當前路徑下執行patch

[wln@localhost patch]$ cd old/

[wln@localhost old]$ patch -r -p1 < ../a.patch 

patching file a/a.txt

patching file a/b/foo.txt

==============================================

==============================================

git am的使用主要是為了保留patch中的修改提交者和日誌、日期等資訊,以備之後使用.

通常打patch使用:patch -p1 < 0001--jffs2-community-fix-with-not-use-oob.patch

這種方法來操作,但不會有patch中的有用資訊,git am就可將這些資訊全部打進**中去,因為這些patch顯然是用git format-patch來生成的。

1.在使用git-am之前, 要首先

git am –abort

2.git-am 可以一次合併乙個檔案,或者乙個目錄下所有的patch.

若有一堆patch, 名字是上面提到的那一堆patch, 你把他們放在~/patch-set/目錄下(路徑隨意)

cd opencore

git am ~/patch-set/*.patch

(這裡git就會按照檔名的順序一次am這些patch)如果一切順利, 你所有的patch都ok了, 你又lucky了。

不過不順利的時候十有**,如果git am中間遇到了patch失敗,am就會停到打這個patch的地方, 告訴你是哪個patch打不上去。

3.

git am –skip

//忽略乙個patch

4.git am -abort

//撤銷整個am的東西

Linux下生成patch和打patch

通過diff工具生成補丁,patch工具打上補丁.在使用diff之前,你需要保留乙份未修改過的原始碼,然後在其它地方修改原始碼的乙份拷貝.diff對比這兩份原始碼生成patch.修改過的原始碼必須保留原來的檔名,例如,如果你修改原始碼中的a.c檔案,那麼,修改後的檔案還是名為a.c,在修改之前你可以...

Linux下生成patch和打patch

在使用diff之前,你需要保留乙份未修改過的原始碼,然後在其它地方修改原始碼的乙份拷貝.diff對比這兩份原始碼生成patch.修改過的原始碼必須保留原來的檔名,例如,如果你修改原始碼中的a.c檔案,那麼,修改後的檔案還是名為a.c,在修改之前你可以複製a.c為a.orig.c進行備份.1 diff...

Linux下生成patch和打patch

在使用diff之前,你需要保留乙份未修改過的原始碼,然後在其它地方修改原始碼的乙份拷貝.diff對比這兩份原始碼生成patch.修改過的原始碼必須保留原來的檔名,例如,如果你修改原始碼中的a.c檔案,那麼,修改後的檔案還是名為a.c,在修改之前你可以複製a.c為a.orig.c進行備份.diff u...