diff和patch十分鐘指南

2021-06-28 10:16:59 字數 2686 閱讀 6299

情景一:你正嘗試從**編譯乙個軟體包,發現有人已經對**進行了小小的修改以便在你的系統上編譯。他們通過補丁的方式發布自己的成果,但是你卻不知道該如何使用它。答案是你使用乙個叫做patch(很貼切)的命令列工具將補丁應用到原始**上。 

這是乙份diff和patch的快速指南,通過講解它們最常見的用法來幫你解決上面問題。它告訴你的東西足夠讓你立刻開始使用。之後,你可以在閒暇的時候用manpage來學習diff和patch的前前後後。我總是樂意聽到你們的問題和意見。用聯絡表單跟我取得聯絡。 

用patch命令應用補丁 

要對單個檔案應用補丁,進入需要打補丁的檔案所在的目錄並呼叫patch命令: 

patch < foo.patch 

這些命令假定補丁是以統一格式分發的,這種格式指明了補丁要應用到的檔案。如果不是,你可以在命令列裡指定檔案: 

patch foo.txt < bar.patch 

應用補丁到整個目錄(這種情況也許更常見)也是類似的,但是你必須注意設定p級別。就是說,在補丁檔案裡,需要打補丁的檔案在你電腦上的路徑名跟在建立補丁的電腦上可能不同。p級別告訴patch命令忽略掉路徑名的幾個部分以正確的識別檔案。通常p級別為1就夠了,所以你使用: 

patch -p1 < bar.patch 

執行該命令之前,你應該進入源**目錄的頂層目錄。如果補丁級別1不能正確識別任何需要打補丁的檔案,檢查補丁檔案裡的檔名。如果你看到這樣乙個檔名: 

而你當前正工作在乙個包含net/http.c的目錄,使用: 

patch -p5 < bar.patch 

總的來說,對於從路徑最開始刪除的每個路徑分隔符(斜線字元)加一,直到剩下的部分存在於你的工作目錄中。最後得到的就是p級別。

要刪除補丁,用-r引數,例如: 

patch -p5 -r bar.patch 

使用diff建立補丁 

不論是對於單個檔案還是整個原始碼目錄,使用diff都很簡單。為單個檔案建立補丁,用下面形式: 

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

為整個原始碼樹建立補丁,複製乙份原始碼樹: 

cp -r original new 

在目錄new/裡進行必要的修改,然後用下面的命令建立補丁: 

diff -rupn original/ new/ > original.patch 

這就是diff和patch入門需要的所有知識。要獲得更多的資訊用: 

man diff 

man patch

**patch

對修改的檔案比較差異,並建立乙個補丁檔案(patch),其實很簡單,下面就對patch做簡單的介紹:

一、建立補丁檔案

diff -naur 舊的目錄 新的目錄 > patch檔案
或者

diff -naur 舊的檔案 新的檔案 > patch檔案

對於目錄層數的一些限制,在建立patch的時候資料夾的層數應當是一樣的,比如

--- old/lib/twiki aug 17 11:03:56 2008

+++ new/lib/twiki aug 19 20:05:41 2008

這樣是可以的。而
--- old/other/lib/twiki aug 17 11:03:56 2008

+++ new/lib/twiki aug 19 20:05:41 2008

這樣做可能會出問題。

二、如何使用patch

1,對於乙個patch檔案,有兩種常用使用方法:

cat new-patch | patch -p02.

patch -p0 < new-patch

2,patch命令裡面的層數(-p0?-p1?)

引數-p來指定從第幾層開始比較。比如有乙個patch檔案的補丁頭是這樣的:

--- old/lib/twiki aug 17 11:03:56 2008

+++ new/lib/twiki aug 19 20:05:41 2008

如果使用引數-p0,就表示從當前目錄,找乙個叫作new的目錄,在它下面找乙個叫lib的目錄,再在它下面找乙個叫twiki的目錄。

如果使用引數-p1,就表示忽略第一層,從當前目錄找乙個叫lib的目錄,在它下面找乙個叫twiki的目錄。這樣會忽略掉補丁頭提到的new目錄。

依此類推。

三、patch檔案的結構

1,補丁頭

補丁頭是分別由---/+++開頭的兩行,用來表示要打補丁的檔案。

乙個補丁檔案中的多個補丁

乙個補丁檔案中可能包含以---/+++開頭的很多節,每一節用來打乙個補丁。所以在乙個補丁檔案中可以包含好多個補丁。

2,塊塊是補丁中要修改的地方。它通常由一部分不用修改的東西開始和結束。他們只是用來表示要修改的位置。他們通常以@@開始,結束於另乙個塊的開始或者乙個新的補丁頭。

3,塊的縮排

塊會縮排一列,而這一列是用來表示這一行是要增加還是要刪除的。

4,塊的第一列

+號表示這一行是要加上的。

-號表示這一行是要刪除的。

沒有加號也沒有減號表示這裡只是引用的而不需要修改。

diff和patch十分鐘指南

情景一 你正嘗試從 編譯乙個軟體包,發現有人已經對 進行了小小的修改以便在你的系統上編譯。他們通過補丁的方式發布自己的成果,但是你卻不知道該如何使用它。答案是你使用乙個叫做patch 很貼切 的命令列工具將補丁應用到原始 上。這是乙份diff和patch的快速指南,通過講解它們最常見的用法來幫你解決...

課間十分鐘

時間限制 1000 ms 記憶體限制 128 mb 兩人都是數學愛好者,便發明了乙個遊戲。在遊戲開始前,他們先約定乙個正整數n,同時令m 1。遊戲過程中,每個人都可以將m的值擴大2到9中的任意倍數。第乙個使m n的人就是最後的贏家。181818181818和zbt都十分聰明,並且遊戲過程中都使用最佳...

十分鐘的代價

2008年9月15日上午10 00,擁有158年歷史的美國第四大投資銀行 雷曼兄弟公司向法院申請破產保護,訊息轉瞬間通過電視 廣播和網路傳遍地球的各個角落。令人匪夷所思的是,在如此重大的情況下,德國國家發展銀行在十分鐘後,居然按照外匯掉期協議的交易,通過計算機自動付款系統,向雷曼兄弟公司即將凍結的銀...