如何在Linux中将补丁应用到文件(和创建补丁)

的Linux 修补 命令使您可以快速,安全地将更改从一组文件传输到另一组文件。学习使用方法 修补 简单的方法。

patch和diff命令

假设您的计算机上有一个文本文件。您会从其他人那里收到该文本文件的修改版本。您如何快速将所有更改从修改后的文件转移到原始文件?那边 修补差异 参加进来。 修补差异 可以在Linux和其他类似Unix的操作系统(例如macOS)中找到。

差异 命令检查文件的两个不同版本,并列出它们之间的差异。差异可以存储在称为补丁文件的文件中。

修补 该命令可以读取补丁文件,并将其内容用作一组指令。按照这些说明,将修改后的文件中的更改复制到原始文件中。

现在,假设该过程发生在整个文本文件目录中。一口气。那就是 修补.

有时您不会收到修改后的文件。您发送的只是补丁文件。当您可以发送一个文件或发布一个文件以方便下载时,为什么还要发送几十个文件呢?

您如何使用补丁文件来实际补丁文件?除了几乎会说话,这也是一个很好的问题。我们将在本文中逐步引导您。

修补 该命令最常用于处理软件源代码文件的人员,但无论其用途是什么,无论源代码是什么,它对于任何文本文件集都同样适用。

有关的:如何在Linux终端中比较两个文本文件

我们的示例场景

在这种情况下,我们位于一个名为work的目录中,该目录包含另外两个目录。一个叫做 在职的, 另一个叫做 最新的。工作目录包含一组源代码文件。最新目录包含这些源代码文件的最新版本,其中一些已被修改。

为了安全起见,工作目录是文本文件当前版本的副本。它不是它们的唯一副本。

查找文件的两个版本之间的差异

差异 命令查找两个文件之间的差异。它的默认操作是在终端窗口中列出修改后的行。

一个文件称为 slang.c。我们将工作目录中的版本与最新目录中的版本进行比较。

-u (统一)选项告诉 差异 还列出了每个更改部分之前和之后的一些未修改的文本行。这些行称为上下文行。他们帮助修补 命令精确定位必须在原始文件中进行更改的位置。

我们提供文件名,以便 差异 知道要比较的文件。首先列出原始文件,然后列出修改后的文件。这是我们发出的命令 差异:

diff -u working / slang.c最新/slang.c

差异 产生一个输出列表,显示文件之间的差异。如果文件相同,则根本不会列出任何输出。看到以下类型的输出 差异 确认两个文件版本之间存在差异,并且原始文件需要打补丁。

制作补丁文件

要捕获补丁文件中的这些差异,请使用以下命令。与上面的命令相同,输出为 差异 重定向到名为slang.patch的文件中。

diff -u working / slang.c最新/slang.c> slang.patch

补丁文件的名称是任意的。您可以随便叫它。给它一个“ .patch”扩展名是个好主意。但是,因为它确实使它清楚是什么类型的文件。

使修补 对补丁文件进行操作并修改working / slang.c文件,请使用以下命令。这 -u (统一)选项可以 修补 知道补丁文件包含统一的上下文行。换句话说,我们将-u选项与diff一起使用,因此我们将 -u 与选项 修补.

补丁-u working.slang.c -i slang.patch

如果一切顺利,则只有一行输出告诉您 修补 正在修补文件。

备份原始文件

我们可以指导 修补 在使用修补程序更改之前制作修补文件的备份副本-b (备份)选项。这 -一世 (输入)选项告诉修补程序要使用的修补程序文件的名称:

 补丁-u -b working.slang.c -i slang.patch 

该文件像以前一样打过补丁,输出没有明显差异。但是,如果您查看工作文件夹,则会看到名为slang.c.orig的文件已创建。文件的日期和时间戳显示slang.c.orig是原始文件,而slang.c是由以下文件创建的新文件: 修补.

对目录使用diff

我们可以用 差异 创建一个补丁文件,其中包含两个目录中文件之间的所有差异。然后,我们可以将该补丁文件与 修补 使用单个命令将这些差异应用于工作文件夹中的文件。

我们将要使用的选项 差异-u (统一上下文)选项,我们之前使用过 -r (递归)选项 差异 查看任何子目录和 -N (新文件)选项。

-N 选项告诉 差异 如何处理最新目录中不在工作目录中的文件。它迫使 差异 将说明放在补丁文件中,以便修补 创建在最新目录中存在但在工作目录中丢失的文件。

您可以将选项组合在一起,以便它们使用单​​个连字符(-).

请注意,我们仅提供目录名称,而不是告诉您 差异 查看特定文件:

diff -ruN工作/最新/> slang.patch

在修补程序文件中偷看

让我们快速浏览一下补丁文件。我们将使用 较少的 看一下它的内容。

文件顶部显示slang.c的两个版本之间的差异。

在补丁文件中向下滚动,我们看到它随后在另一个名为structs.h的文件中描述了更改。这可以验证补丁文件是否确实包含多个文件的不同版本之间的差异。

三思而后行

修补大量文件可能会有些令人不安,因此我们将使用 -空运行 在进行大胆尝试并做出更改之前,检查所有内容的选项都很好。

-空运行 选项告诉 修补 除了实际修改文件之外,还可以做其他所有事情。 修补 将对文件执行所有的飞行前检查,如果遇到任何问题,它将报告这些问题。无论哪种方式,都不会修改文件。

如果未报告任何问题,我们可以重复执行该命令,而无需 -空运行 选项并放心修补我们的文件。

-d (目录)选项告诉 修补 在哪个目录上工作。

请注意,我们 不是 使用 -一世 (输入)选项告诉 修补 哪个补丁文件包含来自的指令 差异。相反,我们将补丁文件重定向到 修补<.

修补程序--dry-run -ruN -d工作<slang.patch

在整个目录中, 差异 找到两个要修补的文件。有关对这两个文件的修改的说明已由 修补 ,并且没有任何问题的报告。

飞行前检查还可以;我们已经准备起飞。

修补目录

为了将补丁真正应用到文件,我们使用前面的命令,而无需 -空运行 选项。

补丁-ruN -d工作<slang.patch

这次输出的每一行都不以“检查”开头,而是每一行以“补丁”开头。

并没有问题的报告。我们可以编译我们的源代码,并且将使用该软件的最新版本。

解决您的差异

到目前为止,这是最简单,最安全的使用方式 修补。将您的目标文件复制到一个文件夹并对该文件夹进行修补。当您对修补过程完成无错感到满意时,可以将它们复制回去。


$config[zx-auto] not found$config[zx-overlay] not found