Linux下patch的用法【轉】


什么是patch

patch即補丁之意,記錄文件中的不同,能夠與文件進行整合,從而改變文件中的內容。

如何制作patch

在Linux系統中提供了diff程序,可以使用diff程序,比較文件之間的不同從而制作出patch文件

  1. 在系統中(我用的是Ubuntu)創建diff文件夾,創建test1.txt,test2.txt
    mkdir diff
    vi test1.txt
    vi test2.txt

    test1.txt文件內容如下

    aaaa

    test2.txt文件內容如下

    aaaa
    bbbb
  2. 使用diff命令制作patch文件
  3. diff -Naur test1.txt test2.txt > test.patch

    之后在當前目錄中會存在三個文件

    test1.txt test2.txt test.patch

    test.patch 文件的內容

    --- test1.txt   2018-08-01 13:17:33.530350672 +0800
    +++ test2.txt   2018-08-01 13:18:54.326350260 +0800
    @@ -1 +1,2 @@ 
     aaaa
    +bbbb

    diff參數解釋
         -N 在比較目錄時如果某個文件只出現了一次,那么在比較不同時會默認和空文件比較
              -a 將所有的文件都作為普通text(之比較文本文件)
             -u 以合並的方式顯示文件內容的不同
             -r 如果是文件夾則進行遞歸進行比較

如何使用patch

  1. 准備好patch文件和原版本文件
    創建patch文件夾,將test1.txt 和test.patch文件拷貝進去
mkdir patch
cp test1.txt test.patch../patch/
  1. 執行patch命令
patch -p0 < test.patch

        3.test1.txt文件內容如下

aaa
bbb

  可以看到patch已經打進去了


參數介紹:
  patch命令中最常用的就是-pX這個參數
  在上面我們注意到patch文件如下內容

--- test1.txt   2018-08-01 13:17:33.530350672 +0800

  此時我們的參數為-p0,此時patch 就會在當前目錄下尋找test1.txt文件,如在在patch文件中是這樣記錄的

---a/b/test1.txt   2018-08-01 13:17:33.530350672 +0800

  那么-p0會在當前目錄下尋找a目錄,a目錄下尋找b,之后在b中尋找test1.txt文件。
  如果是 -p1,patch命令就會舍棄a,先尋找b再尋找test1.txt
  如果是-p2 ,會舍棄a/b,直接尋找test1.txt
  所以-pX中 X代表就是所要舍棄的層級目錄

補充: 

  -p0 選項要從當前目錄查找目的文件(夾)

  -p1 選項要忽略掉第一層目錄,從當前目錄開始查找。

  ************************************************************

  在這里以實例說明:

    ---old/modules/pcitable            Mon Sep 27 11:03:561999

    +++new/modules/pcitable       Tue Dec 19 20:05:412000

    如果使用參數-p0,那就表示從當前目錄找一個叫做old的文件夾,在它下面尋找modules下的pcitable文件來執行patch操作。

    如果使用參數-p1,那就表示忽略第一層目錄(即不管old),從當前目錄尋找modules的文件夾,在它下面找pcitable。

    這樣的前提是當前目錄必須為modules所在的目錄。而diff補丁文件則可以在任意位置,只要指明了diff補丁文件的路徑就可以了。

    當然,可以用相對路徑,也可以用絕對路徑。不過我一般習慣用相對路徑。

  ************************************************************

  -E  選項說明如果發現了空文件,那么就刪除它

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

  簡單的示例:

    方式一:$patch File0.cpp diff.patch

    方式二:$patch -p0 < diff.patch

  通過下面的命令,可以去除補丁,恢復舊版本

    $ patch -RE -p0 < diff.patch

  patch文件的結構

  (1)補丁頭:

    補丁頭是分別由---/+++開頭的兩行,用來表示要打補丁的文件。---開頭表示舊文件,+++開頭表示新文件。

  (2)塊:

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

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

  塊的第一列:

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

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

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

--- File0.cpp    2013-08-01 13:40:35.579447633 +0800
+++ File1.cpp    2013-08-01 13:41:04.609447640 +0800
@@ -1 +1 @@
-The First file.
+The Second File.

  patch還有很多參數,但是-pX是最為常用的

  簡單的說,patch就是利用diff制作的補丁來實現源文件(夾)和目的文件(夾)的轉換。這樣說就意味着你可以由源文件(夾)――>目的文件(夾),也可以由目的文件(夾)――>源文件(夾)。

patch的應用場景

patch多用於系統升級,只要有一個基礎版本,以及基於這個版本的一些patch,就可以進行升級。

轉自:https://www.cnblogs.com/paul8339/p/11598782.html  僅供參考學習使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM