当前位置: 首页 > Linux

差异和补丁简介

时间:2023-04-06 05:19:16 Linux

如果您曾有机会使用分布式开发模型处理大型代码库,您可能听说过类似“Sue刚刚发送了一个补丁补丁”、“Rajiv正在检查outthecheckingoutdifferencediff”,也许这些词(补丁,差异文件)对你来说比较陌生,你肯定想明白它们的意思。开源软件对上述名词做出了巨大贡献。“基于补丁的开发”模式作为从ApacheWeb服务器到Linux内核的大型项目的开发模式,贯穿于上述项目之中。其实你可能不知道Apache的名字来源于“aseriesofcodepatches”(LCTT翻译注:Apache的英文发音与patch的英文patch相似),针对原先的NCSAHTTPd服务器一一收集源代码。修改。您可能认为这只是轶事,但早期Apache站点的档案声称Apache的名字来自最早的“补丁”集合;“patchedAPAtCHy”服务器,缩写为Apache。好了,废话不多说,程序员口中的“差异”和“补丁”到底是什么?首先,在这篇文章中,我们可以认为这两个术语指的是同一个概念。“差异”是“差异”的缩写;同名的Unix实用程序diff分析一个或多个文件之间的“差异”。下面我们将看到diff的示例:“补丁”是一组文件之间的差异,可以通过Unixdiff程序应用于源代码树。我们可以使用diff工具来创建“差异”(或“补丁”),然后使用该工具针对没有补丁的相同源代码版本“打孔”它们。此外,(我又要离题了一些历史轶事......),“补丁”这个词实际上是指用于覆盖穿孔纸带的补丁,以便在计算的早期对软件进行检查-在机器上覆盖纸,那个时代的穿孔纸带是在计算机处理器上运行的程序。下面这张来自维基页面的图片真实地描述了“补丁”这个词的最初来源:现在您已经对补丁和差异有了基本的了解,让我们来看看软件开发人员如何使用这些工具。如果您还没有使用过Git或subversion等源代码版本控制工具,我将逐步展示最流行的软件项目如何使用它们。如果把一个软件的生命周期看成一条时间线,就可以看到软件的变化,比如什么时候在源代码中增加了一个功能,什么时候在源代码中修复了一个功能缺陷。我们将这些更改点称为“提交”。“commit”这个词是当今最流行的源代码版本管理工具Git使用的,当你想查看一次commit前后的代码变化时,(或者多次commit之间的代码变化),你可以使用工具来观察文件差异。如果您还使用Git开发软件,则可以在本地开发环境中进行一些提交,将这些提交提交给其他开发人员以添加到他们的源代码树中。为了向其他开发人员提供您的提交,一种方法是创建本地文件的差异文件,然后将此“补丁”发送给与您在同一源代码树中工作的其他开发人员。在其他开发人员“应用”您的补丁后,他们可以在您的代码更改树中看到更改。Linux、Git和GitHub共享补丁的开发模式,正是当今Linux内核社区处理内核修改提案的方式。如果你有机会浏览任何主要的Linux内核邮件列表——主要是LKML,还有linux-containers、fs-devel、Netdev等,你会发现许多开发人员会发布他们希望其他内核开发人员发布的内容在官方LinuxGit树中查看、测试或合并补丁。当然,讨论Git不在本文范围之内(Git是由LinusTorvalds开发的源代码控制系统,支持分布式开发模型,允许补丁独立于主代码存储库,可以推送或拉取。)不同的源代码树,并遵循这些树各自的开发过程。)在继续我们的话题之前,我们当然不能忽略与补丁和差异概念相关的最流行的服务:GitHub。从名字就可以猜到,GitHub是基于Git的,它还提供了基于Web和API的工作流管理,用于围绕Git的分布式开源代码开发模型。(LCTT译注:PullRequestPullRequest)。在GitHub上,共享补丁的方式不是像Linux内核社区那样通过邮件列表,而是通过创建一个pullrequest。当您提交对自己的源代码树的更改时,您可以通过针对软件项目的共享存储库创建一个“拉取请求”来共享您的代码更改那些去“fork”这个仓库的人,然后在之后为这个主仓库创建一个拉取请求他们各自的提交。所有的pullrequest只有经过主仓库的核心开发人员批准后才能合并到主代码库中。)GitHub被当今许多活跃的开源社区使用,例如Kubernetes、Docker、容器网络接口(CNI)、Istio,和更多。在GitHub世界中,用户倾向于使用基于Web的方法来审查拉取请求中的补丁或差异,或者您可以直接访问原始补丁并直接在命令行上使用它们。现在是真正的东西现在我们已经介绍了补丁和差异是如何在流行的开源社区中应用的,让我们看一些例子。第一个示例涉及源代码树的两个不同副本,其中一个有代码更改,我们想使用diff来查看这些更改是什么。在这个例子中,我们要查看“合并格式统一”格式的补丁,这是当今软件开发世界中最常见的格式。如果想了解更详细参数的使用以及如何生成差异文件,请参考diff手册。原始代码在sources-orig目录下,修改后的代码在sources-fixed目录下。要在命令行上以“合并格式”显示补丁,请运行以下命令。(LCTT译注:参数-N表示如果要比较的文件不存在,则认为是空文件,-a表示将所有文件视为文本文件,-u表示使用合并格式并输出上下文,-r表示递归比较目录)