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是什么含義呢?
看一下補丁文件中的路徑信息:
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目錄下。
此時就應該是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目錄下也可以用命令
為什么使用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
總結
- 上一篇: html鼠标变成小手_HTML 点击的链
- 下一篇: matlab 复合辛普森公式,复合梯形和