(ZT)diff和patch使用指南

來源:互聯網
上載者:User
diff和patch使用指南t
o^MS2
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  Vj
diff和patch是一對工具,在數學上來說,diff是對兩個集合的差運算,patch是對兩個集合的和運算。%i0F@/
diff比較兩個檔案或檔案集合的差異,並記錄下來,產生一個diff檔案,這也是我們常說的patch檔案,即補丁檔案。'u
patch能將diff檔案運用於 原來的兩個集合之一,從而得到另一個集合。舉個例子來說檔案A和檔案B,經過diff之後產生了補丁檔案C,那麼著個過程相當於 A -B = C ,那麼patch的過程就是B+C = A 或A-C =B。1d8
因此我們只要能得到A, B, C三個檔案中的任何兩個,就能用diff和patch這對工具產生另外一個檔案。;u
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  '*]l
這就是diff和patch的妙處。下面分別介紹一下兩個工具的用法:wL46B
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  hTEX
1. diff的用法6g[e9
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  >ulG
diff後面可以接兩個檔案名稱或兩個目錄名。 如果是一個目錄名加一個檔案名稱,那麼只作用在那麼個目錄下的同名檔案。Dr_
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  Sq~+
如果是兩個目錄的話,作用於該目錄下的所有檔案,不遞迴。如果我們希望遞迴執行,需要使用-r參數。"
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  rq>V(H
命令diff A B > C ,一般A是原始檔案,B是修改後的檔案,C稱為A的補丁檔案。Z
不加任何參數產生的diff檔案格式是一種簡單的格式,這種格式只標出了不一樣的行數和內容。我們需要一種更詳細的格式,可以標識出不同之處的上下文環境,這樣更有利於提高patch命令的識別能力。這個時候可以用-c開關。>Psu
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  ^5G%V
2. patch的用法2v
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  F<&
patch用於根據原檔案和補丁檔案產生目標檔案。還是拿上個例子來說>?o=
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  &
patch A C 就能得到B, 這一步叫做對A打上了B的名字為C的補丁。O
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  s
之一步之後,你的檔案A就變成了檔案B。如果你打完補丁之後想恢複到A怎麼辦呢?Ip
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  R!aWdE
patch -R B C 就可以重新還原到A了。w$4
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  6x
所以不用擔心會失去A的問題。[U&kMC
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  F
其實patch在具體使用的時候是不用指定原檔案的,因為補丁檔案中都已經記載了原檔案的路徑和名稱。patch足夠聰明可以認出來。但是有時候會有點小問題。比如一般對兩個目錄diff的時候可能已經包含了原目錄的名字,但是我們打補丁的時候會進入到目錄中再使用patch,著個時候就需要你告訴 patch命令怎麼處理補丁檔案中的路徑。可以利用-pn開關,告訴patch命令忽略的路徑分隔字元的個數。舉例如下:.:*;o!
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  "AE/fl
A檔案在 DIR_A下,修改後的B檔案在DIR_B下,一般DIR_A和DIR_B在同一級目錄。我們為了對整個目錄下的所有檔案一次性diff,我們一般會到DIR_A和DIR_B的父目錄下執行以下命令rA>J J
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  OAbX&
diff -rc DIR_A DIR_B > C}$W
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  XdU
這個時候補丁檔案C中會記錄了原始檔案的路徑為 DIR_A/A M.b
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  U9
現在另一個使用者得到了A檔案和C檔案,其中A檔案所在的目錄也是DIR_A。 一般,他會比較喜歡在DIR_A目錄下面進行patch操作,它會執行h/H
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  I
patch < CO%LSso
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  z%L
但是這個時候patch分析C檔案中的記錄,認為原始檔案是./DIR_A/A,但實際上是./A,此時patch會找不到原始檔案。為了避免這種情況我們可以使用-p1參數如下i:
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  B8}
patch -p1 < Ct~s{z'
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  `|y
此時,patch會忽略掉第1個”/”之前的內容,認為原始檔案是 ./A,這樣就正確了。Pn
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。   hnV<
最後有以下幾點注意:8P<?
OldLinux論壇 -- 有關早期Linux核心代碼發展的論壇。  N%YG%b
1. 一次打多個patch的話,一般這些patch有先後順序,得按次序打才行。?FL
2. 在patch之前不要對原檔案進行任何修改%
3. 如果patch中記錄的原始檔案和你得到的原始檔案版本不匹配(很容易出現),那麼你可以嘗試使用patch, 如果幸運的話,可以成功。大部分情況下,會有不匹配的情況,此時patch會產生rej檔案,記錄失敗的地方,你可以手工修改。LW]CF:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.