diff生成一个输出列表,显示文件之间的差异。如果文件相同,则根本不会列出任何输出。从diff看到这种类型的输出,可以确认两个文件版本之间存在差异,并且原始文件需要打补丁。
制作修补程序文件
要在补丁文件中捕获这些差异,请使用以下命令。该命令与上面的命令相同,将diff的输出重定向到一个名为slang.patch的文件中。
diff -u working/slang.c latest/slang.c > slang.patch
补丁文件的名称是任意的。你可以叫它任何你喜欢的名字。给它一个“.patch”扩展名是个好主意;但是,因为它确实清楚地表明了它是什么类型的文件。
要使补丁作用于补丁文件并修改Working/slang.c文件,请使用以下命令。u(统一)选项让补丁程序知道补丁程序文件包含统一的上下文行。换句话说,我们将-u选项与diff一起使用,因此我们将-u选项与patch一起使用。
patch-u working.slang.c-i slang.patch
如果一切顺利,会有一行输出告诉您修补程序正在修补文件。
备份原始文件
我们可以使用-b(备份)选项指示Patch在更改修补文件之前对其进行备份。-i(输入)选项告诉补丁要使用的补丁文件的名称:
patch -u -b working.slang.c -i slang.patch
文件像以前一样打了补丁,输出没有明显差异。但是,如果您查看工作文件夹,您将看到名为slang.c.orig的文件已经创建。文件的日期和时间戳显示slang.c.orig是原始文件,slang.c是Patch创建的新文件。
对目录使用diff
我们可以使用diff创建一个补丁文件,该文件包含两个目录中文件之间的所有差异。然后,我们可以将该补丁文件与补丁一起使用,通过单个命令将这些差异应用于工作文件夹中的文件。
我们将与diff一起使用的选项是前面使用的-u(统一上下文)选项、使diff查看任何子目录的-r(递归)选项和-N(新文件)选项。
-N选项告诉diff如何处理最新目录中不在工作目录中的文件。它强制diff将指令放入补丁文件中,以便补丁创建在最新目录中存在但在工作目录中缺失的文件。
您可以将这些选项捆绑在一起,以便它们使用单个连字符(-)。
请注意,我们仅提供目录名,而不是告诉diff查看特定文件:
diff -ruN working/ latest/ > slang.patch
窥探修补程序文件内部
让我们快速查看一下补丁文件。我们将使用LESS来查看其内容。
文件的顶部显示了slang.c的两个版本之间的差异。
进一步向下滚动补丁文件,我们看到它描述了另一个名为structs.h的文件中的更改。这将验证补丁文件是否确实包含多个文件的不同版本之间的差异。
三思而后行
修补大量文件可能会让人有点不安,因此我们将使用--ry-run选项来检查是否一切正常,然后再冒险并承诺进行更改。
干运行选项告诉补丁执行除实际修改文件之外的所有操作。Patch将对文件执行所有的飞行前检查,如果遇到任何问题,它会报告这些问题。无论采用哪种方式,都不会修改任何文件。
如果没有报告任何问题,我们可以重复该命令,而不使用--ry-run选项,并自信地修补我们的文件。
-d(目录)选项告诉Patch要处理哪个目录。
注意,我们没有使用-i(输入)选项来告诉补丁哪个补丁文件包含来自diff的指令。相反,我们使用<将修补程序文件重定向到修补程序。
patch --dry-run -ruN -d working < slang.patch
在整个目录中,diff找到了两个要修补的文件。补丁程序已经检查了这两个文件的修改说明,没有报告任何问题。
飞行前的检查都没问题,我们已经准备好起飞了。
修补目录
要真正将补丁应用到文件,我们使用前面的命令,但不带--ry-run选项。
patch -ruN -d working < slang.patch
这一次,输出的每一行都不是以“检查”开头,而是每一行都以“修补”开头。
并且没有报告任何问题。我们可以编译我们的源代码,我们将使用软件的最新版本。
解决你们之间的分歧
这是迄今为止使用补丁最简单、最安全的方式。将目标文件复制到文件夹并修补该文件夹。当您对修补过程无误地完成感到高兴时,请将它们复制回去。