日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

patch命令用法

發布時間:2025/3/15 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 patch命令用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作為程序員,了解diff和patch命令是非常必要的。比如說發現某個項目有bug,而自己又沒有提交權限,此時最合適的解決方法就是用diff命令做一個補丁發給組長。組長看到補丁后會立刻明白你的意圖。
有人說直接傳一個工程不就完了?不要忘了,補丁文件尺寸更小傳輸更快,而且可以明顯看到都做了哪些修改。就算你把修改后的工程傳過去,組長還需要用對比工具查看做了哪些修改,這樣費時費力。

下面開始做實驗。

創建實驗目錄和文件

創建一個實驗目錄demo

mkdir demo

進入demo

cd demo

模擬一個項目目錄src

mkdir -p src/a/b/c/d

創建一個文件

vim src/a/b/c/d/file

內容是

line1
line2
line3

假設我們發現項目src需要修改,那么拷貝src并命名為src_new

cp -r src src_new

并且修改src_new/a/b/c/d/file的內容為

new_line1
new_line2
new_line3

此時,demo目錄下用tree命令的結果是:

制作補丁

在demo目錄下用diff命令打補丁,不要使用絕對路徑,而應該使用相對路徑。

diff -Nur src src_new >src.patch

關于diff的用法,可以參考我的博文:
http://blog.csdn.net/longintchar/article/details/74139933

瀏覽一下補丁文件:

至此,補丁制作完成。

這時候在demo目錄下用tree命令,得到

打補丁

在demo目錄下,試試下面命令:

patch -p0 <src.patch

回車后終端顯示

patching file src/a/b/c/d/file

這里的p0是什么含義呢?
看一下補丁文件中的路徑信息:

--- src/a/b/c/d/file 2017-07-02 18:41:19.269641100 +0800 +++ src_new/a/b/c/d/file 2017-07-02 18:32:06.687035200 +0800

p0表示不跳過任何目錄(使用完整路徑)。即從當前目錄中查找src/a/b/c/d/file.
因為是在demo目錄下使用patch命令,src目錄就在demo目錄下,不必跳過任何目錄,所以此時使用的是p0。

此時查看src/a/b/c/d/file,你會發現內容已經修改成

new_line1
new_line2
new_line3

這時候如果再次使用patch命令,系統會問你是否想還原,輸入y 還原:

patching file src/a/b/c/d/file
Reversed (or previously applied) patch detected! Assume -R? [n]

這時候src/a/b/c/d/file的內容已經還原成舊的了:

line1
line2
line3

如果你想指定還原文件, 可以使用-R參數:

patch -Rp0 <src.patch

已經明白了p0,那么p1、p2呢?
我們把路徑切換到src目錄下。

cd src

此時就應該是p1,而不是p0了; 另外引用src.patch文件的路徑也要適當變一下,因為當前目錄已經是src了

patch -p1 <../src.patch

再看看補丁文件中的路徑信息:

--- src/a/b/c/d/file 2017-07-02 18:41:19.269641100 +0800 +++ src_new/a/b/c/d/file 2017-07-02 18:32:06.687035200 +0800

此時我們是在src目錄下使用patch命令,p1表示忽略第一個斜杠及左邊,即尋找a/b/c/d/file,而a就在當前目錄下,所以使用p1.

為了繼續測試,我們還原一下

patch -Rp1 <../src.patch

繼續變換路徑,測試p2參數:

cd a

然后

patch -p2 <../../src.patch

因為補丁文件中的路徑信息是

--- src/a/b/c/d/file 2017-07-02 18:41:19.269641100 +0800 +++ src_new/a/b/c/d/file 2017-07-02 18:32:06.687035200 +0800

此時我們是在a目錄下使用patch命令,p2表示忽略第2個斜杠及左邊,即尋找b/c/d/file,而b就在當前目錄下,所以使用p2.

還原后繼續實驗,我們進入到d目錄

patch -p5 <../../../../../src.patch

依然觀察補丁文件中的路徑信息:

--- src/a/b/c/d/file 2017-07-02 18:41:19.269641100 +0800 +++ src_new/a/b/c/d/file 2017-07-02 18:32:06.687035200 +0800

此時我們是在d目錄下使用patch命令,p5表示忽略第5個斜杠及左邊,即尋找file,而file就在當前目錄下,所以使用p5.

有人會問,不使用p參數會有什么結果呢?
不使用p參數 時候,patch命令會忽略所有斜杠,直接使用文件,即本文中的file
所以在d目錄下也可以用命令

patch <../../../../../src.patch

為什么使用diff命令時最好不要使用絕對路徑,而應該使用相對路徑?

答:如果使用絕對路徑,那么補丁文件里的路徑信息會類似下面的樣子:

--- /x/xx/xxx/src/a/b/c/d/file 2017-07-02 18:41:19.269641100 +0800 +++ /x/xx/xxx/src_new/a/b/c/d/file 2017-07-02 18:32:06.687035200 +0800

如此一來,當別人想應用你的補丁時,因為目錄結構肯定有差異,所以就不得不費力判斷到底使用p幾。這樣一來就容易出錯.
相反,如果使用相對路徑的話,大多數時候,p0或者p1就足夠了,不易出錯。

總結

假如補丁頭是

--- src/a/b/c/d/file 2017-07-02 18:41:19.269641100 +0800 +++ src_new/a/b/c/d/file 2017-07-02 18:32:06.687035200 +0800

使用p0 表示在當前目錄下查找src/a/b/c/d/file
使用p1 表示在當前目錄下查找a/b/c/d/file
使用p2 表示在當前目錄下查找b/c/d/file
使用p3 表示在當前目錄下查找c/d/file
使用p4 表示在當前目錄下查找d/file
使用p5 表示在當前目錄下查找file
不使用pn表示忽略所有斜杠,在當前目錄下查找file

打補丁的命令格式是

patch -pn < 補丁文件

還原的命令格式是

patch -Rpn < 補丁文件

(n=0,1,2,3…)

【參考資料】
[1] http://blog.csdn.net/wh_19910525/article/details/7515540

總結

以上是生活随笔為你收集整理的patch命令用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。