1.基本命令語法:
patch [-R] {-p(n)} [--dry-run] < patch_file_name
p:為path的縮寫。
n:指將patch文件中的path第n條’/’及其左邊部分取消。
-R:卸載patch包。
--dry-run:嘗試patch軟件,並不真正修改軟件。
例如:
$ patch -p1 < /home/sense/patch-2.6.19.1 安裝補丁
$ patch -p1 -R < /home/sense/patch-2.6.19.1 卸載補丁
例如:
0002-main.patch main.c
diff --git a/src/core/main.c b/src/core/main.c
如果這兩個文件在同目錄下,那么就要省略三層目錄(目錄路徑中有三個"/"),因此打補丁命令為:
$ patch -p3 < 0002-main.patch
2.假如發現某個項目有bug代碼,而自己又沒有svn的提交權限,那么此時最合適的解決方法就是用diff命令做一個補丁發給項目成員。項目成員通過patch命令可以立刻知道你的意圖。
3.實驗
$ diff -Naur old new > foo.patch
其中-Naur參數屬於固定打法,不管是對一個文件,還是對一個目錄,在使用這個參數基本就可以了。
$ patch -p0 < foo.patch (或者進入下層目錄,$ patch -p1 < ../foo.patch )
如果再次使用會提示是否還原,輸入y就還原。
如果你想嚴格指定是應用補丁可以使用下面命令(就是增加N參數):
# patch -Np0 < foo.patch
如果你想嚴格指定是還原補丁可以使用下面命令(就是增加R參數):
# patch -Rp0 < foo.patch
4.總結
單個文件
diff –uN from-file to-file >to-file.patch 制作補丁
patch –p0 < to-file.patch 打補丁
patch –RE –p0 < to-file.patch 還原
多個文件
diff –uNr from-docu to-docu >to-docu.patch
patch –p1 < to-docu.patch
patch –R –p1
二、使用git打補丁
1.檢測補丁有無問題
$ git apply --check xxx.patch
2. error: xxxxx: patch does not apply
出現這種一般會是補丁沖突,這種一般是強制打上補丁(使用--reject)后根據產生的*.rej文件來手動解決沖突。
3. warning: xxxx.c has type 100644, expected 100755
出現這種警告一般是文件內沒有沖突,但是文件的權限發生變動。一般沒有影響。
4.強制打補丁
$ git apply --reject xxx.patch
然后再手動修改沖突,find ./ -name *.rej找到這些沖突的補丁,手動打上
5.git am同樣有--reject選項,添加這個選項可以將能打上的補丁先打上,沖突的文件生成*.rej文件。
git apply xxx.patch
git apply xxx.diff
檢查 patch / diff:
git apply --check xxx.patch
git apply --check xxx.diff
若git和需要打patch的文件不在一個目錄:(git在framework下,patch要打入frameworks/base/下)
git apply --check --directory=base/ xxx.patch
git apply --directory=base/ xxx.patch
** git am 后面會說到,以及生產patch和打
補充:
在Yocto中編譯過程中打補丁時,也可以使用這種方法,補丁中的文件路徑名是可以改的,不影響補丁的成功打入。
補充:
1. 從補丁頭信息中獲取打補丁的方法
補丁頭標識:
//顯示如何得到補丁的,注意目錄是在linux-4.19-rc3下 diff -urN linux-4.19-rc3/arch/arm/boot/dts/jz2440.dts linux-4.19-rc3_device_tree/arch/arm/boot/dts/jz2440.dts --- linux-4.19-rc3/arch/arm/boot/dts/jz2440.dts 1970-01-01 08:00:00.000000000 +0800 +++ linux-4.19-rc3_device_tree/arch/arm/boot/dts/jz2440.dts 2018-09-19 11:05:14.705211815 +0800
打補丁的方法:
//注意也要在這個目錄下,然后用-p1剝去這個目錄 # linux-4.19-rc3# patch -p1 < linux-4.19-rc3_device_tree_for_jz2440.patch
2. 對整個目錄生成補丁
diff -urN old_dir new_dir > patch
參考:http://blog.csdn.net/maotianwang/article/details/11107083?reload
http://www.360doc.com/content/13/0323/23/8363527_273525975.shtml