在項目中,有些模塊是開源的,沒有源碼或者不能改動源碼,想要修複、優化裡面的Bug,這時就需要用到patch了。 1. 生成patch 製作補丁有兩種法法,diff和quilt。 1.1 diff方法製作patch 1.1.1 示例 l 第一步,創建兩個文件,test.c源文件和修改後的文件test_ ...
在項目中,有些模塊是開源的,沒有源碼或者不能改動源碼,想要修複、優化裡面的Bug,這時就需要用到patch了。
1. 生成patch
製作補丁有兩種法法,diff和quilt。
1.1 diff方法製作patch
1.1.1 示例
l 第一步,創建兩個文件,test.c源文件和修改後的文件test_1.c。
ubuntu:~/code/test/patch$ cat test.c aa bb ubuntu:~/code/test/patch$ cat test_1.c aa 11 22 bb
l 第二步,生成補丁,diff -u test.c test_1.c > 01_test.patch
ubuntu:~/code/test/patch$ cat 01_test.patch --- test.c 2018-07-20 15:48:43.694824855 +0800 +++ test_1.c 2018-07-20 15:49:08.650825272 +0800 @@ -1,2 +1,4 @@ aa +11 +22 bb
1.1.2 diff命令
簡 單的說,diff的功能就是用來比較兩個文件的不同,然後記錄下來,也就是所謂的diff補丁。
diff [options] from-file to-file
from-file 源文件
to-file 根據源文件修改後的文件
option:
-u 顯示有差異行的前後幾行(上下文), 預設是前後各3行, 這樣, patch中帶有更多的信息.
-p顯示代碼所在的c函數的信息
-N 選項確保補丁文件將正確地處理已經創建或刪除文件的情況。
-a逐行比較文本文件
-r比較子目錄中的文件
1.2 quilt方式製作patch
quilt是一個製作和應用補丁的工具,它適合於管理較多補丁。
1.2.1 示例
l 第一步,quilt new 02_test.patch新加一個補丁文件
l 第二步,修改文件quilt edit test.c,進入文本框進行文件編輯
aa 11 22 bb ^G Get Help ^O WriteOut ^R Read File ^Y Prev Page ^K Cut Text ^C Cur Pos ^X Exit ^J Justify ^W Where Is ^V Next Page ^U UnCut Text ^T To Spell
l 第三步,quilt refresh將改動保存到patch中。
當前目錄下增量了pathc目錄,補丁文件02_test.patch即放在了改目錄下。
ubuntu:~/code/test/patch$ cat patches/02_test.patch Index: patch/test.c =================================================================== --- patch.orig/test.c 2018-07-20 15:48:43.694824855 +0800 +++ patch/test.c 2018-07-20 16:06:31.490842723 +0800 @@ -1,2 +1,4 @@ aa +11 +22 bb
1.2.2 quilt命令
quilt top 查看最近的一個patch
quilt add {files} 關聯文件
quilt remove files 取消關聯文件,是add相反的操作
quilt diff 查看對比修改的內容
quilt files 查看當前patch關聯的文件
quilt series 查看左右的patch
quilt pop 回退剛纔文件的改動
2. 打patch
2.1 示例
l 第一步,存在兩個文件,源文件test.c和patch文件01_test.patch
ubuntu:~/code/test/patch$ cat test.c aa bb ubuntu:~/code/test/patch$ cat 01_test.patch --- test.c 2018-07-20 15:48:43.694824855 +0800 +++ test_1.c 2018-07-20 15:49:08.650825272 +0800 @@ -1,2 +1,4 @@ aa +11 +22 bb
l 第二步,打patch,patch test.c < 01_test.patch,查看源文件,已經有了補丁上的修改。
ubuntu:~/code/test/patch$ cat test.c aa 11 22 bb
2.2 命令
patch -RE < 01_test.patch 取消patch對源文件的修改
patch -p1 < patch1.diff
p表示跳過幾級目錄,0標識不去掉為全路徑,1標識去掉第一層路徑
註意:patch -p後面是不能帶負數 的。不使用p參數的時候,patch命令會 忽略 任何目錄,直接使用文件。