手把手教你 Linux 下打 Patch
本文轉載自微信公眾號「嵌入式Linux系統(tǒng)開發(fā)」,作者Jasonangel 。轉載本文請聯(lián)系嵌入式Linux系統(tǒng)開發(fā)公眾號。
在項目中,如果和其他人一起維護一個項目,有時候別人修改了一些代碼,更換 .c 文件也很麻煩,這時就需要用到 patch 了,別人只要發(fā)一個 patch ,你打上即可。
patch:補丁,用來顯示兩個文件不同的地方。
制作補丁有兩種方法,diff 和 quilt,本文我們討論 diff。
1、創(chuàng)建兩個文件,a.c 和 b.c
a.c
- #include <stdio.h>
- int main()
- {
- printf("Jason 20220116\r\n");
- return 0;
- }
b.c
- #include <stdio.h>
- int main()
- {
- printf("Jason 20220116\r\n");
- printf("test diff patch\r\n");
- return 0;
- }
2、生成補丁
- diff -u a.c b.c > test.patch
上圖可以看到 test.patch 的內容,包括修改時間,修改的哪一行,都標注的很明顯。
diff
比較兩個文件的不同,然后記錄下來,也就是所謂的 diff 補丁。
- diff [options] from-file to-file
from-file:源文件
to-file:根據源文件修改后的文件
option:
-u 顯示有差異行的前后幾行(上下文), 默認是前后各 3 行, 這樣, patch 中帶有更多的信息
-p 顯示代碼所在的 c 函數(shù)的信息
-N 選項確保補丁文件將正確地處理已經創(chuàng)建或刪除文件的情況
-a 逐行比較文本文件
-r 比較子目錄中的文件
打 patch
兩個文件:需要打補丁的文件 a.c 和 patch 文件 test.patch
打補丁命令如下:
- patch a.c < test.patch
實際操作如下:
補充:
patch -RE < test.patch 取消 patch 對源文件的修改
patch -p1 < test.patch
p 表示跳過幾級目錄,0 標識不去掉為全路徑,1 標識去掉第一層路徑。路徑信息包含了你的 Linux 源碼根目錄的名稱,但其他人的源碼根目錄可能是其它名字,所以,打補丁時,要進入你的 Linux 源碼根目錄,并且告訴 patch 工具,請忽略補丁中的路徑的第一級目錄。
注意:patch -p 后面是不能帶負數(shù) 的。不使用 p 參數(shù)的時候,patch 命令會 忽略 任何目錄,直接使用文件。
多文件打 patch
本文是兩個文件做比較,打 patch,比較簡單。如果是一個工程,有多個文件修改,需要在 diff 后面增加兩個屬性:
-r 遞歸地對比一個目錄和它的所有子目錄(即整個目錄樹).
-N 如果某個文件缺少了,就當作是空文件來對比. 如果不使用本選項,當 diff 發(fā)現(xiàn)舊代碼或者新代碼缺少文件時,只簡單的提示缺少文件。如果使用本選項,會將新添加的文件全新打印出來作為新增的部分。