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...