1. 程式人生 > >如何使用patch命令打補丁

如何使用patch命令打補丁

有時候因為條件限制,我們不能使用git倉庫進行程式碼的更新工作。
例如你需要更新伺服器的程式碼,一般的生產環境上面的程式碼是某個版本的程式碼而非整個git倉庫。
當你進行了一些開發,你需要將你的程式碼部署到伺服器上面,進行一系列測試。
這時,使用patch是一個不錯的辦法。

  • 確保你的伺服器上安裝了patch命令。如果沒有安裝,在聯網狀態下安裝一下也就幾分鐘的事。
  • 在你本地生成patch檔案。在你的git倉庫中,生成patch 檔案有兩種方法。
    • 使用 git format-patch commit_id。這條命令會把從HEAD到你指定的commit_id的所有提交都單獨生成一個patch檔案。這種情況下生成的patch 檔案只適用於伺服器上要更新的 程式碼也是一個git倉庫裡的程式碼。
    • 使用 git diff master (or commit_id) > test.patch。這條命令生成的patch檔案可以在linux系統上直接用patch命令打到程式碼裡,也就是所謂的通用patch。這裡master就是master分支;也可以是你想對比的版本號。比如HEAD^,就會把你的最新程式碼和 HEAD^這個版本進行比較,並生成patch檔案。
  • 將你的patch檔案拷貝到你的伺服器工程目錄中,使用命令patch -pn < patch_file
    n的意思就是忽略掉幾個/。例如:
    --- a/aaa/bbb/ccc.py
    +++ b/aaa/bbb/ccc.py
    
    如果你把這個patch 檔案放到你伺服器上的../aaa
    目錄,那麼你只需要忽略掉上面的diff比較的檔案路徑的第一個/就可以了,也就是你應該使用命令:patch -p1 < patch_file

注意
應用patch到時候會有一些輸出,注意看是否有錯誤資訊。
另外,應用完成以後記得查詢一下.rej檔案,如果有這種檔案表示應用失敗,一般的原因就是程式碼衝突。
不要慌,開啟這個.rej以及相應的.orig檔案對比一下你就知道衝突在哪了,解決掉衝突就可以了。

撤銷patch
將打上的補丁給恢復回去:
patch -R pn < patch_file