楚汉争]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 了,你能把它转发给其他开发人员,他们能够把这个补丁打到自已的源码树枝从而获得和你一样的源代码并测试他们。如果一个开发者的当前工作目录就是他的源代码树的根的话,他可以用下面的命令来打补丁:

{n}

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

{n}

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

{n}

{n}{t}现在这个

原创文章,作者:leping,如若转载,请注明出处:https://www.wxymghbl.com/hq-2193.html

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

相关推荐