十分鐘學習diff和patch

Martin Wang發表於2013-07-26

十分鐘學習diff和patch

翻譯自: The Ten Minute Guide to diff and patch

情形一:你想要編譯一個原始碼包,但是你發現已經有人少量修改了原始碼讓它能夠順利在你的電腦上編譯。 他們的工作以補丁(patch)的形式釋出,但是你不知道如何使用補丁。答案是,你使用一條命令列將補丁作用於原始碼上,使用的工具是patch。

情形二:你已經下載了某個開源軟體的原始碼包,經過了一個小時的勞作,你作出了少量的修改,使得原始碼成功在你的電腦上編譯。你想把你的工作分享給其他程式設計師,或者軟體的作者們,但是你不願意釋出修改過的整個軟體包的原始碼。那麼你需要建立一個補丁,這時你需要的工具是diff。

這是一個diff和patch的快速指南,描述了這兩個工具的最常用使用方法,可以幫助你解決如上兩種情形下的問題。

讀完之後,你就可以立刻開始這兩個工具了。如果你想進一步瞭解更多關於diff和patch的優缺點,請參考man幫助頁面。

使用patch應用補丁

為了將一個補丁應用於單個檔案,進入該檔案所在的目錄,然後執行patch命令:

patch <foo.patch

上面的命令假定補丁檔案使用的是統一的格式,從補丁檔案中可以定位到被修改的檔案。如果並非如此, 你需要在命令列中指定這個待修改的檔案。

patch foo.txt < bar.patch

將補丁應用於整個目錄(這種情況更常見)的方法是類似的,但是你需要小心設定一下路徑層次(p level)。 在補丁檔案中,被修改檔案的路徑來自於生成補丁的那臺電腦,很有可能與你的電腦上的路徑是不一樣的。這個路徑層次(p level)告訴patch程式忽略路徑前面的幾個部分,以便正確地定位待修改檔案。 大部分情況下,一層(忽略第一層路徑)已經足夠,命令是

patch -p1 <baz.patch

你應該進入原始碼的頂層目錄後再執行這個命令。如果一級層次沒能正確定位到檔案位置,檢視一下 補丁檔案確認檔案的路徑名稱,比如你可能會看到如下檔案

/users/stephen/package/src/net/http.c

而你的當前目錄中正好有net/http.c檔案,你就可以使用命令

patch -p5 <baz.patch

通常,從路徑開頭開始,數一下路徑分隔符(斜劃線)的個數,直到剩下的部分在當前目錄中存在,得到的分隔符總數就是你需要使用的路徑層次(p level)。

打完補丁之後還可以撤銷,方法是使用-R選項。比如

patch -p5 -R <baz.patch

使用diff建立補丁

diff的使用很簡單,包括單個檔案和整個原始碼目錄兩種情況。為單個檔案打補丁的語法是

diff -u original.c new.c >original.patch

對於整個原始碼樹,首先拷貝一份原始碼

cp -R origianl new

隨後在new目錄中作出必要的修改,然後使用下面的語法建立補丁:

diff -rupN original/ new/ >origianl.patch

上面這些命令已經足夠你開始使用diff和patch。欲知更多詳情,請參考

man diff
man patch

其他語言版本

這篇文章已經有多個翻譯版本。

English: The Ten Minute Guide to diff and patch

Spanish: Guia de 10 minutos de diff y patch

Portuguese: O Guia de Dez Minutos de diff e patch

French: diff et patch en dix minutes

Polish: 10 minut z diff i patch

German: diff und patch in zehn Minuten

中文:十分鐘學習diff和patch

相關文章