楚漢爭]patch補丁如何使用(patch補丁操作方法)

 


差異文件(diff)和補丁文件(patch)簡介

 

編譯程序自:

https://opensource.com/article/18/8/diffs-patches

作者: Phil Estes

譯員: DavidChenLiang

本文詳細介紹 差別文檔(diff)和 補丁文檔(patch),及其他們怎樣在開源項目中常用的事例。

假如你曾經還有機會在一個應用分布式開發模型的大中型代碼庫上工作過,你就要聽過類似下邊得話,“Sue 剛發來一個 補丁(patch)”,“Rajiv 已經 簽入(checking out) 差別(diff)”, 很有可能這些詞(補丁、差別文檔)對于你來說好陌生,但你明確特想弄懂他們到底指什么。開源項目對上述提及的詞匯有非常大的奉獻,做為工程項目從 Apache web 網絡服務器到 Linux 核心的開發模型,“根據補丁文件信息開發設計” 這一方式貫穿了以上工程項目的自始至終。事實上,很少有人知道 Apache 名字的就來源于“一系列的編碼補丁”(LCTT 譯注:Apache 英文的發音和補丁的英文 patch 類似),他們被一一保存起來并對原先的 NCSA HTTPd server source code 展開了修定。

你可能會覺得這只不過些逸聞,可是一份早期 Apache 的網站歸檔中 宣稱 Apache 名字的就來自于最早“補丁”結合;即“ 打補丁的(APAtCHy)”網絡服務器,簡單化為 Apache。

好啦,大破沖霄樓,程序猿口中講的“差別”和“補丁”究竟是什么?

最先,在本文里,我們能覺得這倆專業術語都朝著同一個定義。“diff” 是 ”difference“ 的縮寫;Unix 中的同名的專用工具程序流程 diff剖析了一個或幾個文檔間的“差別”。下面我們就會看見 diff 的事例:

一個“補丁”是指文檔中間一系列差別,這種差別會被 Unix 的 diff 程序流程運用在源碼樹枝。我們可以應用 diff 專用工具來建立“差別”(或“補丁”),隨后使用這個專用工具把它們 “打” 在一個沒有那個補丁的相同的源碼版本號上。除此之外,(我又要開始偏題說一些歷史時間趣事了……),“補丁” 這詞確實指在計算機中的初期應用考勤機時,用于附著在打孔紙帶上來對手機軟件進行調整的遮蓋紙,那個年代打孔紙帶便是在計算機中Cpu上運轉的程序流程。下邊來源于 維基百科網頁頁面 的這張圖片深切的描寫了最初“打補丁”這詞的來源:

 


差異文件(diff)和補丁文件(patch)簡介

 

如今我對補丁和差別就了一個基本上這個概念,一起來看看軟件開發技術是如何使用這個工具的使用。如果還并沒有用過類似 Git 或 subversion 這種源碼版本控制工具得話,我將會一步步展現最流行軟件產品是如何使用它們。假如我們將一個軟件的生命期看作是一條時間軸得話,你就可以看到這個app的點點滴滴轉變,例如在什么時候源碼加了一個作用,在什么時候源碼處理了一個作用缺點。人們稱這種變化的點為“ 遞交(commit)”,“遞交”這詞被現如今最流行源碼版本號可視化工具 Git 所用,當你要查驗在一個遞交的前后編碼轉變得話,(或是在很多個遞交間的編碼轉變),你都可以用專用工具來分析文檔差別。

假如你一樣使用 Git 軟件開發得話,我會在你當地開發工具做一些期待交到其他開發人員的遞交,以導入到學生的源碼樹中。是為了給其他開發人員你遞交,一個辦法就是創建一個你本地文件的差別文檔,再將這一“補丁”發給與你工作中在同一個源碼樹其他開發人員。其他開發人員在“打”了你補丁以后,就可以看到在您的編碼變樹上的轉變。

這類共享補丁的開發模型恰好是現如今 Linux 核心小區怎樣處理核心改動建議而使用的實體模型。假如你有機遇訪問任何一個熱門的 Linux 核心郵件歸檔 —— 通常是 LKML ,也包含 linux-containers 、 fs-devel 、 Netdev 這些,你可以看到許多開發人員會貼出來他們想要讓所有內核開發者審批、檢測或是合入 Linux 官方網 Git 編碼樹某一的位置補丁。自然,探討 Git 不在本文范圍內(Git 是通過 Linus Torvalds 研發的源碼自動控制系統,它適用分布式開發實體模型及其容許不同于關鍵代碼倉庫的補丁包,這種補丁包會被消息推送或獲取到不同類型的源碼樹枝,并遵循這種編碼樹各自研發流程。)

在持續我們自己的話題討論以前,我們當然不能忽視和補丁和差別這一概念有關的最流行服務項目: GitHub 。從他們的名字就可猜測出 GitHub 都是基于 Git 的,并且它也圍繞 Git 對分布式系統開放源碼開發模型帶來了根據 Web 和 API 的工作流管理。(LCTT 譯注:即 獲取要求(Pull Request))。在 GitHub 上,共享補丁的形式不是像 Linux 核心小區那般根據郵件歸檔,而是用創建一個 獲取要求 。如果你遞交你的源碼樹修改時,你可以根據創建一個對于項目管理的共享倉庫的“獲取要求”來分享自己的編碼修改(LCTT 譯注:即關鍵開發人員維護保養一個主庫房,開發人員去“ 還原(fork)”這一庫房,待各自遞交之后再建立對于這一主倉庫獲取要求,每一個獲取要求由主倉庫關鍵開發人員審批后才可以合進駐代碼庫。)GitHub 被現如今許多有活力的開源項目所選用,如 Kubernetes 、 Docker 、 器皿網線端口 (CNI) 、 Istio 這些。在 GitHub 的世界中,客戶會側重于應用根據 Web 網頁頁面的方式去審批一個獲取要求中的補丁或差別,你可以直接瀏覽最原始的補丁并且在cmd上直接用他們。

大家之前已經說了在最流行的開源項目里是如何運用補丁和差距的,如今看一下一些事例。

第一個事例包含一個源碼樹兩種不同團本,其中一個有編碼修改,大家想要 diff 來看看這個修改是啥。這個案例里,我們想看是指“ 合拼文件格式(unified)”的補丁,這也是如今開發軟件世界中最通用文件格式。如果要了解更參數信息用法如何更好地形成差別文檔,請見 diff 指南。最原始的編碼在 sources-orig 文件目錄,而修改后編碼在 sources-fixed 文件目錄。如果想在您的cmd上放“合拼文件格式”來呈現補丁,請運作如下所示指令。(LCTT 譯注:主要參數 -N 意味著假如相對比較文件不存在,卻認為是一個空文件, -a 意味著將所有文件夾都做為文本文檔看待,-u 意味著應用合拼文件格式并導出前后文,-r 意味著遞歸算法較為文件目錄)

$ diff -Naur sources-orig/ sources-fixed/

……以下是 diff 指令的導出:

diff -Naur sources-orig/officespace/interest.go sources-fixed/officespace/interest.go

— sources-orig/officespace/interest.go 2018-08-10 16:39:11.000000000 -0400

sources-fixed/officespace/interest.go 2018-08-10 16:39:40.000000000 -0400

@@ -11,15 11,13 @@

InterestRate float64

}

// compute the rounded interest for a transaction

func computeInterest(acct *Account, t Transaction) float64{

interest := t.Amount * t.InterestRate

roundedInterest := math.Floor(interest*100) / 100.0

remainingInterest := interest – roundedInterest

– // a little extra..

– remainingInterest *= 1000

// Save the remaining interest into an account we control:

acct.Balance = acct.Balance remainingInterest

最初兩行 diff 指令的導出要這樣表述:三個 — 顯示原先文件信息名稱;一切在原文件(LCTT 譯注:并不是源代碼)里存有但在新文件里不存在的已然用到作為前綴 -,用于表明這種行被從源碼里“減掉”了。而 表述的剛好相反:在新文件里被再加上的公會被放上作為前綴 ,表明這就是在新文件里被“再加上”的行。補丁文檔中的每一個補丁“塊”(用 @@ 做為作為前綴的的那一部分)都是有前后文的號碼,這能夠幫助補丁專用工具(或其他Cpu)了解在編碼的哪兒運用這一補丁塊。你可以看到己經更改了“Office Space”這部影片里提及那個函數公式(移除開三行并加了一行代碼注釋),電影中那一個有點兒貪心的技術工程師但是悄悄的在算利息的函數公式里加了點“料”哦。(LCTT譯注:故事情節詳情敬請見影片

https://movie.douban.com/subject/1296424/)

假如你想找個人來檢測你編碼修改,你能將差別儲存到一個補丁里:

$ diff -Naur sources-orig/ sources-fixed/ >myfixes.patch

如今您有補丁 myfixes.patch 了,你能把它轉發給其他開發人員,他們能夠把這個補丁打到自已的源碼樹枝從而獲得和你一樣的源代碼并測試他們。如果一個開發者的當前工作目錄就是他的源代碼樹的根的話,他可以用下面的命令來打補?。?/p>

{n}

{n}{t}$ patch -p1 < http://www.yujujie.cn/myfixes.patch

{n}

{n}{t}patching file officespace/interest.go

{n}

{n}{t}現在這個

原創文章,作者:leping,如若轉載,請注明出處:http://www.qdgszy.com/hq-2193.html

(0)
上一篇 2022年10月3日 下午4:15
下一篇 2022年10月3日 下午6:08

相關推薦

日韩三级片网站,嫩草影视欧美,国产裸体歌舞一区二区,久久不射视频