linux -- patch補丁文件以及相關內容

本文的目的是向Linux新手介紹一種無價的資源,Larry Wall的patch程序。patch是用來查找文件之間差異的GNU diff命令的一個接口;diff有很多選項,但是該命令最常用的用途是用來生成一個文件,該文件中列出了內容發生改變的行,顯示兩個原始文件、修改過的 行以及由於內容沒有變化而忽略掉的行。

patch典型地用於把一個目錄下的源代碼文件更新到新的版本,從而就避免了下載整個新的源代碼檔案的必要。

diff 和 patch 是相輔相成的, diff命令產生patch文件, 由patch命令解析執行。

先介紹diff
diff的功能就是用來比較兩個文件的不同,然後記錄下來,也就是所謂的diff補丁。


格式 : diff[參數][文件1或目錄1][文件2或目錄2]


參數 : 這裏只提幾個能和patch一起使用的
-a或--text  diff預設只會逐行比較文本文件。
-N或--new-file  在比較目錄時,若文件A僅出現在某個目錄中,預設會顯示:Only in目錄:文件A若使用-N參數,則diff會將文件A與一個空白的文件比較。
-r或--recursive  比較子目錄中的文件。
-u,-U或--unified=  以合併的方式來顯示文件內容的不同。
-c  顯示全部內文,並標出不同之處。

一般就使用  -Nur
產生patch文件
命令diff A B >C ,一般A是原始文件,B是修改後的文件,C稱爲A的補丁文件。

不加任何參數生成的diff文件格式是一種簡單的格式,這種格式只標出了不一樣的行數和內容。我們需要一種更詳細的格式,可以標識出不同之處的上下文環境,這樣更有利於提高patch命令的識別能力。這個時候可以用-c開關。

patch 命令用於打補丁,補丁文件是使用diff產生的
patch就是利用diff製作的補丁來實現源文件(夾)和目的文件(夾)的轉換。這樣說就意味着你可以有源文件(夾)――>目的文件(夾),也可以目的文件(夾)――>源文件(夾)。

patch 命令語法

patch [  -b [ -B Prefix ] ] [  -f ] [ -l ] [ -N ] [ -R ] [  -s ] [  -v ] [  -c | -e | -n ] [  -d Directory ] [  -D Define ] [  -F Number ] [  -i PatchFile ] [  -o OutFile ] [  -p Number ] [  -r RejectFile ] [  -x Number ] [ File ]

-p0 選項要從當前目錄查找目的文件(夾)
-p1 選項要忽略掉第一層目錄,從當前目錄開始查找。
以此類推

-E 選項說明如果發現了空文件,那麼就刪除它
-R 選項說明在補丁文件中的“新”文件和“舊”文件現在要調換過來了(實際上就是給新版本打補丁,讓它變成老版本)


關於版本控制, 還有一個非常常用的工具 ---- git
不過在git中,我們沒有必要直接使用diff和patch來做補丁,這樣做既危險又麻煩。
git提供了兩種簡單的patch方案。一是用git diff生成的標準patch,二是git format-patch生成的Git專用Patch。

這裏就不介紹git的用法,網上有大量的資料。我的博客裏也有相關介紹。

一 用git diff生成的標準patch
git diff產生標準的diff文件,可以用來產生patch 文件。

例如在master 分支有 a.txt文件

git checkout -b p1 /// 產生一個新分支p1
echo 'abcd' >> a.txt ///
git commit -am "patch p1" /// 產生變化並提交

git diff master  > patch /// 將當前分支與master分支比較,併產生patch文件
git checkout master
git checkout -b p2 /// 產生一個與master相同的分支p2
git apply patch /// 運用patch 文件

git diff p1 /// 此時p1和p2分支相同了。

這裏注意, 
1. 用 git diff [分支名,默認是master] > patch 產生補丁(patch)文件。
用 git apply <補丁文件>, 來打補丁。
2. 在那個目錄做補丁文件, 就在那個目錄應用補丁文件。

二 git format-patch生成的git專用補丁

在對應分支中

git format-patch -M master /// -M 表示要比較的分支

會產生一個 .patch文件
不僅有diff的信息,還有提交者,時間等等,仔細一看你會發現,這是個E-mail的文件,你可以直接發送它!這種patch,我們要用git am來應用。

git am xxxx.patch

(1)兼容性:很明顯,git diff生成的Patch兼容性強。如果你在修改的代碼的官方版本庫不是Git管理的版本庫,那麼你必須使用git diff生成的patch才能讓你的代碼被項目的維護人接受。
(2)除錯功能:對於git diff生成的patch,你可以用git apply --check 查看補丁是否能夠乾淨順利地應用到當前分支中;如果git format-patch 生成的補丁不能打到當前分支,git am會給出提示,並協助你完成打補丁工作,你也可以使用git am -3進行三方合併,詳細的做法可以參考git手冊或者《Progit》。從這一點上看,兩者除錯功能都很強。
(3)版本庫信息:由於git format-patch生成的補丁中含有這個補丁開發者的名字,因此在應用補丁時,這個名字會被記錄進版本庫,顯然,這樣做是恰當的。因此,目前使用Git的開源社區往往建議大家使用format-patch生成補丁。


目前先總結這麼多。

























發佈了79 篇原創文章 · 獲贊 8 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章