如何在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
这次输出的每一行都不以“检查”开头,而是每一行以“补丁”开头。
并没有问题的报告。我们可以编译我们的源代码,并且将使用该软件的最新版本。
解决您的差异
到目前为止,这是最简单,最安全的使用方式 修补
。将您的目标文件复制到一个文件夹并对该文件夹进行修补。当您对修补过程完成无错感到满意时,可以将它们复制回去。