補丁(patch)的制作與應用

為什么80%的碼農都做不了架構師?>>> ??hot3.png

轉自http://linux-wiki.cn/wiki/zh-hans/%E8%A1%A5%E4%B8%81(patch)%E7%9A%84%E5%88%B6%E4%BD%9C%E4%B8%8E%E5%BA%94%E7%94%A8

如果hack了開源代碼,為了方便分享(如提交Bug)或自己留存使用,一般都要制作一個補丁(Patch)。在從源碼安裝軟件時,也難免要應用些別人做好的補丁。本文介紹如何制作和應用補丁。[1]

Hint.gif
提示:?
本文目前的多數內容是對《Linux下patch的制作和應用》的修正、整理與重新排版。

目錄

[隱藏]
  • 1?命令簡介
    • 1.1?diff
    • 1.2?patch
    • 1.3?應用
  • 2?patch文件構成
  • 3?實例分析
    • 3.1?單文件補丁
    • 3.2?文件夾補丁
  • 4?參考資料

命令簡介

用到的兩個命令是diff和patch。

diff

diff可以比較兩個東西,并可同時記錄下二者的區別。制作補丁時的一般用法和常見選項為:

diff 【選項】 源文件(夾) 目的文件(夾)
-r 遞歸。設置后diff會將兩個不同版本源代碼目錄中的所有對應文件全部都進行一次比較,包括子目錄文件。 -N 選項確保補丁文件將正確地處理已經創建或刪除文件的情況。 -u 輸出每個修改前后的3行,也可以用-u5等指定輸出更多上下文。 -E, -b, -w, -B, --strip-trailing-cr 忽略各種空白,可參見文檔,按需選用。

patch

patch的作用則是將diff記錄的結果(即補丁)應用到相應文件(夾)上。最常見的用法為:

patch -pNUM <patchfile>
-p Num 忽略幾層文件夾,隨后詳解。 -E 選項說明如果發現了空文件,那么就刪除它 -R 取消打過的補丁。

為了解釋?-p?參數,需要看看如下patch文件片段:

--- old/modules/pcitable       Mon Sep 27 11:03:56 1999
+++ new/modules/pcitable       Tue Dec 19 20:05:41 2000

如果使用參數?-p0,那就表示從當前目錄找一個叫做old的文件夾,再在它下面尋找?modules/pcitable?文件來執行patch操作。
而如果使用參數?-p1,那就表示忽略第一層目錄(即不管old),從當前目錄尋找?modules?的文件夾,再在它下面找pcitable。

應用

利用以上命令,處理單個文件補丁的方法:

# 產生補丁
diff -uN from-file to-file >to-file.patch# 打補丁
patch -p0 < to-file.patch# 取消補丁
patch -RE -p0 < to-file.patch

對整個文件夾打補丁的情況:

# 產生補丁
diff -uNr  from-docu  to-docu  >to-docu.patch# 打補丁
cd to-docu
patch -p1 < to-docu.patch# 取消補丁
patch -R -p1 <to-docu.patch

另外,使用版本控制工具時,可以直接用svn diffgit diff生成補丁文件。

值得一提的是,由于應用補丁時的目標代碼和生成補丁時的代碼未必相同,打補丁操作可能失敗。補丁失敗的文件會以.rej結尾,下面命令可以找出所有rej文件:

find . -name '*.rej'

patch文件構成

補丁文件里到底存儲了哪些信息呢?看看這個例子:

--- test0       2006-08-18 09:12:01.000000000 +0800
+++ test1       2006-08-18 09:13:09.000000000 +0800
@@ -1,3 +1,4 @@
+222222111111
-111111
+222222111111
補丁頭 補丁頭是分別由---/+++開頭的兩行,用來表示要打補丁的文件。---開頭表示舊文件,+++開頭表示新文件。 一個補丁文件中的多個補丁 一個補丁文件中可能包含以---/+++開頭的很多節,每一節用來打一個補丁。所以在一個補丁文件中可以包含好多個補丁。 塊 塊是補丁中要修改的地方。它通常由一部分不用修改的東西開始和結束。他們只是用來表示要修改的位置。他們通常以@ @開始 ,結束于另一個塊的開始或者一個新的補丁頭。 塊的縮進 塊會縮進一列,而這一列是用來表示這一行是要增加還是要刪除的。 塊的第一列 +號表示這一行是要加上的。-號表示這一行是要刪除的。沒有加號也沒有減號表示這里只是引用的而不需要修改。

實例分析

單文件補丁

設當前目錄有文件?test0

111111
111111
111111

和文件test1

222222
111111
222222
111111

使用diff創建補丁test1.patch

diff -uN test0 test1 > test1.patch

因為是單個文件,故不需要 -r 選項。此命令得到如下補丁:

--- test0       2006-08-18 09:12:01.000000000 +0800
+++ test1       2006-08-18 09:13:09.000000000 +0800
@@ -1,3 +1,4 @@
+222222111111
-111111
+222222111111

要應用補丁,只需:

$ patch -p0 < test1.patch
patching file test0

此時test0就和test1一樣了。

如果要取消補丁做出的更改,恢復舊版本:

$ patch -RE -p0 < test1.patch
patching file test0

文件夾補丁

設有如下環境:

--prj0/test0prj0name
--prj1/test1prj1name

prj0/prj0name內容為如下三行:

--------
prj0/prj0name
--------

prj1/prj1name內容為如下三行:

--------
prj1/prj1name
--------

用?diff -uNr?創建補丁,

diff -uNr prj0 prj1 > prj1.patch

得到的patch文件為:

diff -uNr prj0/prj0name prj1/prj0name
--- prj0/prj0name       2006-08-18 09:25:11.000000000 +0800
+++ prj1/prj0name       1970-01-01 08:00:00.000000000 +0800
@@ -1,3 +0,0 @@
---------
-prj0/prj0name
---------
diff -uNr prj0/prj1name prj1/prj1name
--- prj0/prj1name       1970-01-01 08:00:00.000000000 +0800
+++ prj1/prj1name       2006-08-18 09:26:36.000000000 +0800
@@ -0,0 +1,3 @@
+---------
+prj1/prj1name
+---------
diff -uNr prj0/test0 prj1/test0
--- prj0/test0  2006-08-18 09:23:53.000000000 +0800
+++ prj1/test0  1970-01-01 08:00:00.000000000 +0800
@@ -1,3 +0,0 @@
-111111
-111111
-111111
diff -uNr prj0/test1 prj1/test1
--- prj0/test1  1970-01-01 08:00:00.000000000 +0800
+++ prj1/test1  2006-08-18 09:26:00.000000000 +0800
@@ -0,0 +1,4 @@
+222222
+111111
+222222
+111111

如果要應用此補丁,則:

$ ls
prj0  prj1  prj1.patch
$ cd prj0
$ patch -p1 < ../prj1.patch
patching file prj0name
patching file prj1name
patching file test0
patching file test1

此時可用ls看到打補丁后的結果:

$ ls
prj1name  test1

類似的,如果要回滾補丁操作:

$ patch -R -p1 < ../prj1.patch
patching file prj0name
patching file prj1name
patching file test0
patching file test1
$ ls
prj0name  test0

參考資料

  1. ↑?Linux下patch的制作和應用

本文對您有幫助?分享給更多朋友!

?

轉載于:https://my.oschina.net/mskk/blog/892666

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/541440.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/541440.shtml
英文地址,請注明出處:http://en.pswp.cn/news/541440.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php知識點匯總與解答_PHP操作員能力傾向問題與解答

php知識點匯總與解答This section contains Aptitude Questions and Answers on PHP Operators. 本節包含有關PHP運算符的 Aptitude問答。 1) Which of the following types of operators are used in PHP? Arithmetic OperatorsLogical OperatorsArray OperatorsString Oper…

csv導入mysql phpmyadmin_【轉】從phpMyAdmin批量導入Excel內容到MySQL(親測非常簡潔有效)...

今天做項目遇到需要用phpMyAdmin批量導入Excel內容到MySQL數據庫。分析了我的踏坑經歷并且總結一最便捷的一套導入數據的方法&#xff0c;非常實用簡潔&#xff1a;1、修改Excel表的數據&#xff0c;使得Excel中的字段與數據庫字段要一一對應&#xff0c;并加上自增id。2、然后…

weakhashmap_Java WeakHashMap putAll()方法與示例

weakhashmapWeakHashMap類的putAll()方法 (WeakHashMap Class putAll() method) putAll() method is available in java.util package. putAll()方法在java.util包中可用。 putAll() method is used to copy all of the associations or mappings from the given map and assig…

c語言memcmp和java的_C語言memcmp()函數:比較m字節長的兩個字符串s1和s2

函數名&#xff1a;memcmp頭文件&#xff1a;函數原型&#xff1a; void* memcmp(void *s1,void *s2,unsigned m);功能&#xff1a;比較m字節長的兩個字符串s1和s2參數&#xff1a; s1 和 s2 為要比較的字符串unsigned m 為要比較的前m個字節返回值&#xff1a;s1s1s2 返回等…

[下載地址] Subclipse 1.10.9(SVN) _附說明

http://pan.baidu.com/s/1bp6EFHt轉載于:https://www.cnblogs.com/gscq073240/articles/6814429.html

hbase 偽分布安裝 java_HBase基礎和偽分布式安裝配置

一、HBase(NoSQL)的數據模型1.1 表(table)&#xff0c;是存儲管理數據的。1.2 行鍵(row key)&#xff0c;類似于MySQL中的主鍵&#xff0c;行鍵是HBase表天然自帶的&#xff0c;創建表時不需要指定1.3 列族(column family)&#xff0c;列的集合。一張表中有多個行健&#xff0c…

java treemap_Java TreeMap firstEntry()方法及示例

java treemapTreeMap類的firstEntry()方法 (TreeMap Class firstEntry() method) firstEntry() method is available in java.util package. firstEntry()方法在java.util包中可用。 firstEntry() method is used to retrieve the key-value pairs linked with the lowest valu…

linux常用網絡命令ping和arping

linux常用網絡命令ping和arping ping 向目標主機發送icmp請求包 常用來測試當前主機與目標主機網絡連接狀況 常見選項 -c 設置發包的個數 -s 設置發的包的塊大小&#xff0c;最大不超過65507 -W 設置接收回應超時時間 -i …

java printwriter實例_PrintWriter做過濾流+FileWriter案例分析

package com.mstf.ui;import java.io.*;public class TestWriter{public static void main(String args[]){//PrintWriter做過濾流FileWriter//doFilter1();//2、PrintWriter做過濾流OutputStreamWriter//doFilter2();//3、PrintWriter可以作為節點流//doNode();//4、PrintWrit…

treemap比較器_Java TreeMap比較器()方法與示例

treemap比較器TreeMap類的compare()方法 (TreeMap Class comparator() method) comparator() method is available in java.util package. 比較器()方法在java.util包中可用。 comparator() method is used to return the key element in this TreeMap based on the Comparator…

洛谷P1204 [USACO1.2]擠牛奶Milking Cows 前綴和

這題數據比較水 暴搜都能夠過去 1 #include <cstdio>2 #include <cmath>3 #include <cstdlib>4 #include <algorithm>5 #include <string>6 #include <iostream>7 #include <iomanip>8 #include <cstring>9 using namespace s…

java script創建對象_JavaScript七種非常經典的創建對象方式

JavaScript創建對象的方式有很多&#xff0c;通過Object構造函數或對象字面量的方式也可以創建單個對象&#xff0c;顯然這兩種方式會產生大量的重復代碼&#xff0c;并不適合量產。接下來介紹七種非常經典的創建對象的方式&#xff0c;他們也各有優缺點。一、工廠模式可以無數…

java 方法 示例_Java掃描儀具有示例的NextNextInt()方法

java 方法 示例掃描器類的hasNextInt()方法 (Scanner Class hasNextInt() method) Syntax: 句法&#xff1a; public boolean hasNextInt();public boolean hasNextInt(int rad);hasNextInt() method is available in java.util package. hasNextInt()方法在java.util包中可用…

axis2開發webservice之編寫Axis2模塊(Module)

axis2中的模塊化開發。能夠讓開發者自由的加入自己所需的模塊。提高開發效率&#xff0c;減少開發的難度。 Axis2能夠通過模塊&#xff08;Module&#xff09;進行擴展。Axis2模塊至少須要有兩個類&#xff0c;這兩個類分別實現了Module和Handler接口。開發和使用一個Axis2模塊…

java 看書瀏覽器官_JAVA讀取文件流,設置瀏覽器下載或直接預覽操作

最近項目需要在瀏覽器中通過url預覽圖片。但發現瀏覽器始終默認下載&#xff0c;而不是預覽。研究了一下&#xff0c;發現了問題&#xff1a;// 設置response的header&#xff0c;注意這句&#xff0c;如果開啟&#xff0c;默認瀏覽器會進行下載操作&#xff0c;如果注釋掉&…

Java PriorityQueue poll()方法與示例

PriorityQueue類poll()方法 (PriorityQueue Class poll() method) poll() method is available in java.util package. poll()方法在java.util包中可用。 poll() method is used to return the first element with removing an element from this PriorityQueue. poll()方法用于…

scrapy抓取淘寶女郎

scrapy抓取淘寶女郎 準備工作 首先在淘寶女郎的首頁這里查看&#xff0c;當然想要爬取更多的話&#xff0c;當然這里要查看翻頁的url,不過這操蛋的地方就是這里的翻頁是使用javascript加載的&#xff0c;這個就有點尷尬了&#xff0c;找了好久沒有找到&#xff0c;這里如果有朋…

map在Java集合_java集合之Map

MapMap用于保存具有映射關系的數據。Map中key不允許重復&#xff0c;value可以重復&#xff0c;key和value之間存在單向一對一關系HashMap和Hashtable區別1 Hashtable線程安全、HashMap線程不安全&#xff0c;所以HashMap性能高一點2 Hashtable不允許用null做key和value&#x…

Java OutputStream close()方法與示例

OutputStream類close()方法 (OutputStream Class close() method) close() method is available in java.io package. close()方法在java.io包中可用。 close() method is used to close this OutputStream stream and free all system resources linked with this stream and …

怎樣在fastboot 里面加入新的命令

fastboot 是android 默認的一種debug 方法。它的優點是在進入linux kernel 之前就可以操作。默認fastboot 支持的命令&#xff1a; usage: fastboot [ <option> ] <command>commands: update <filename> reflash device …