十分鐘學習diff和patch
十分鐘學習diff和patch
翻譯自: The Ten Minute Guide to diff and patch
情形一:你想要編譯一個原始碼包,但是你發現已經有人少量修改了原始碼讓它能夠順利在你的電腦上編譯。 他們的工作以補丁(patch)的形式釋出,但是你不知道如何使用補丁。答案是,你使用一條命令列將補丁作用於原始碼上,使用的工具是patch。
情形二:你已經下載了某個開源軟體的原始碼包,經過了一個小時的勞作,你作出了少量的修改,使得原始碼成功在你的電腦上編譯。你想把你的工作分享給其他程式設計師,或者軟體的作者們,但是你不願意釋出修改過的整個軟體包的原始碼。那麼你需要建立一個補丁,這時你需要的工具是diff。
這是一個diff和patch的快速指南,描述了這兩個工具的最常用使用方法,可以幫助你解決如上兩種情形下的問題。
讀完之後,你就可以立刻開始這兩個工具了。如果你想進一步瞭解更多關於diff和patch的優缺點,請參考man幫助頁面。
使用patch應用補丁
為了將一個補丁應用於單個檔案,進入該檔案所在的目錄,然後執行patch命令:
patch <foo.patch
上面的命令假定補丁檔案使用的是統一的格式,從補丁檔案中可以定位到被修改的檔案。如果並非如此, 你需要在命令列中指定這個待修改的檔案。
patch foo.txt < bar.patch
將補丁應用於整個目錄(這種情況更常見)的方法是類似的,但是你需要小心設定一下路徑層次(p level)。 在補丁檔案中,被修改檔案的路徑來自於生成補丁的那臺電腦,很有可能與你的電腦上的路徑是不一樣的。這個路徑層次(p level)告訴patch程式忽略路徑前面的幾個部分,以便正確地定位待修改檔案。 大部分情況下,一層(忽略第一層路徑)已經足夠,命令是
patch -p1 <baz.patch
你應該進入原始碼的頂層目錄後再執行這個命令。如果一級層次沒能正確定位到檔案位置,檢視一下 補丁檔案確認檔案的路徑名稱,比如你可能會看到如下檔案
/users/stephen/package/src/net/http.c
而你的當前目錄中正好有net/http.c檔案,你就可以使用命令
patch -p5 <baz.patch
通常,從路徑開頭開始,數一下路徑分隔符(斜劃線)的個數,直到剩下的部分在當前目錄中存在,得到的分隔符總數就是你需要使用的路徑層次(p level)。
打完補丁之後還可以撤銷,方法是使用-R選項。比如
patch -p5 -R <baz.patch
使用diff建立補丁
diff的使用很簡單,包括單個檔案和整個原始碼目錄兩種情況。為單個檔案打補丁的語法是
diff -u original.c new.c >original.patch
對於整個原始碼樹,首先拷貝一份原始碼
cp -R origianl new
隨後在new目錄中作出必要的修改,然後使用下面的語法建立補丁:
diff -rupN original/ new/ >origianl.patch
上面這些命令已經足夠你開始使用diff和patch。欲知更多詳情,請參考
man diff
man patch
其他語言版本
這篇文章已經有多個翻譯版本。
English: The Ten Minute Guide to diff and patch
Spanish: Guia de 10 minutos de diff y patch
Portuguese: O Guia de Dez Minutos de diff e patch
French: diff et patch en dix minutes
Polish: 10 minut z diff i patch
German: diff und patch in zehn Minuten
相關文章
- Diff and Patch
- Vue原始碼學習(十四):diff演算法patch比對Vue原始碼演算法
- 十分鐘學習泊松分佈
- Git 打補丁-- patch 和 diff 的使用(詳細)Git
- Git 打補丁– patch 和 diff 的使用(詳細)Git
- react diff 學習之tree diffReact
- 十分鐘學會FlaskFlask
- 二十分鐘內學會Ruby
- 差異檔案(diff)和補丁檔案(patch)簡介
- 如何使用diff 和 patch 命令對檔案進行協作?
- 睡前十分鐘
- 聊聊vue2.5的patch過程(diff演算法)Vue演算法
- 十分鐘教你學會怎樣看盤
- 十分鐘搞定 GradleGradle
- 十分鐘學會微調大語言模型模型
- 十分鐘學會Golang開發gRPC服務GolangRPC
- 如何使用git 生成patch 和打入patchGit
- 十分鐘快速上手NutUIUI
- 十分鐘看懂AES加密加密
- 十分鐘快速入門 PythonPython
- 三十分鐘拿Git幹活Git
- 三十分鐘寫作訓練
- 十分鐘學會用 Go 編寫 Web 中介軟體GoWeb
- 十分鐘完成vscode配合Eslint使用VSCodeEsLint
- 三十分鐘掌握Webpack效能優化Web優化
- 十分鐘搞懂Lombok使用與原理Lombok
- 十分鐘搞懂分散式爬蟲分散式爬蟲
- 十分鐘 GET 資料分析技巧
- 十分鐘上手前端UI框架Bootstrap前端UI框架boot
- 爬蟲程式十分鐘入門爬蟲
- iOS的http/https請求——十分鐘學會Charles抓包iOSHTTP
- 5分鐘內看懂機器學習和深度學習的區別機器學習深度學習
- 十分鐘上手chrome效能分析皮膚Chrome
- 教你十分鐘構建好 SpringBoot + SSM 框架Spring BootSSM框架
- 十分鐘理解Java中的弱引用Java
- 十分鐘理解 Java 中的動態代理Java
- 十分鐘明白什麼是容器技術
- 三十分鐘快速搭建serverless網盤服務Server
- 十分鐘搭建自己的linux伺服器?Linux伺服器