命令行手册

Man » patch 手册在线 - 详细的 patch 手册页在线文档

🌍
patch - 将补丁文件应用于原始文件

概要

patch [选项] [原始文件 [补丁文件]]

但通常是

patch -pnum <补丁文件

描述

patch 接受一个补丁文件 patchfile,其中包含 diff 程序生成的差异列表,并将这些差异应用于一个或多个原始文件,从而生成已修补的版本。通常,已修补的版本会取代原始文件。可以创建备份;请参阅 -b 或 --backup 选项。要修补的文件名通常从补丁文件中获取,但如果只有一个文件需要修补,则可以在命令行中将其指定为原始文件。

启动时,patch 会尝试确定差异列表的类型,除非被 -c (--context)、-e (--ed)、-n (--normal) 或 -u (--unified) 选项覆盖。补丁程序本身会应用上下文差异(旧式、新式和统一格式)和普通差异,而 ed 差异则简单地通过管道传递到 ed(1) 编辑器。

patch 尝试跳过任何前导垃圾,应用差异,然后跳过任何尾随垃圾。因此,您可以将包含差异列表的电子邮件消息传递给 patch,它应该可以正常工作。如果整个差异以一致的量缩进,或者如果行以 CRLF 结尾,或者如果差异被 RFC 934 中指定的格式封装了一次或多次(即,在以“-”开头的行之前添加“-”),则会考虑这些情况。删除缩进或封装后,以“#”开头的行将被忽略,因为它们被视为注释。

对于上下文差异,并且在较小程度上对于普通差异,patch 可以检测到补丁文件中提到的行号是否不正确,并尝试找到应用补丁的正确位置。作为第一种猜测,它会采用补丁中提到的行号,并加上或减去应用于上一个补丁块时使用的任何偏移量。如果这不是正确的位置,patch 将向前和向后扫描,以查找与补丁块中给定的上下文匹配的一组行。首先,patch 会查找所有上下文行都匹配的位置。如果没有找到这样的位置,并且它是上下文差异,并且最大模糊因子设置为 1 或更大,则将进行另一次扫描,忽略上下文的第一个和最后一个行。如果这失败,并且最大模糊因子设置为 2 或更大,则将忽略上下文的前两个和后两个行,并进行另一次扫描。(默认的最大模糊因子为 2。)

前缀上下文少于后缀上下文(在应用模糊后)的补丁块必须应用于文件的开头,如果其第一行号为 1。后缀上下文多于前缀上下文(在应用模糊后)的补丁块必须应用于文件的末尾。

如果补丁无法找到安装某个补丁块的位置,它会将该补丁块输出到一个 reject 文件中,该文件的名称通常是输出文件的名称加上 .rej 后缀,或者如果 .rej 会生成过长的文件名,则使用 #。如果即使附加单个字符 # 也会使文件名过长,则 # 将替换文件名的最后一个字符。

被拒绝的补丁块以统一格式或上下文差异格式输出。如果输入是普通的差异文件,则许多上下文将为空。在 reject 文件中的补丁块的行号可能与补丁文件中的行号不同:它们反映了补丁认为失败的补丁块应该位于新文件中的近似位置,而不是旧文件。

在每个补丁块完成时,都会告知您该补丁块是否失败,如果是,则会告知您(在新的文件中)补丁认为该补丁块应该放置在哪一行。如果补丁块安装在与差异文件中指定的行号不同的行,则会告知您偏移量。单个较大的偏移量可能表明某个补丁块安装在错误的位置。您还将被告知是否使用了模糊因子来匹配,在这种情况下,您也应该稍微怀疑一下。如果给出了 --verbose 选项,您还将被告知哪些补丁块完全匹配。

如果在命令行上没有指定原始文件 origfile,则补丁会尝试从前导内容中推断要编辑的文件名,并使用以下规则。

首先,补丁会获取一个有序的候选文件名列表,如下所示:

如果头部是上下文差异的头部,则补丁会获取头部中的旧文件和新文件名。如果某个名称没有足够的斜杠来满足 -pnum 或 --strip=num 选项,则会忽略该名称。/dev/null 也会被忽略。

如果前导内容中存在 Index: 行,并且旧名称和新名称都缺失,或者补丁符合 POSIX 标准,则补丁会获取 Index: 行中的名称。

为了以下规则的目的,候选文件名被认为是按 (旧文件、新文件、索引) 的顺序排列的,无论它们在头部中出现的顺序如何。

然后,补丁会从候选列表中选择一个文件名,如下所示:

如果某些命名文件存在,则补丁会选择第一个名称(如果符合 POSIX 标准),或者在其他情况下选择最佳名称。

如果补丁不忽略 RCS、ClearCase、Perforce 和 SCCS(参见 -g num 或 --get=num 选项),并且没有命名文件存在,但找到了 RCS、ClearCase、Perforce 或 SCCS 主文件,则补丁会选择第一个具有 RCS、ClearCase、Perforce 或 SCCS 主文件的命名文件。

如果没有命名文件存在,没有找到 RCS、ClearCase、Perforce 或 SCCS 主文件,提供了一些名称,补丁不符合 POSIX 标准,并且补丁似乎正在创建一个文件,则补丁会选择创建最少目录的最佳名称。

如果上述启发式方法没有产生文件名,则会提示您输入要修补的文件名,然后 patch 命令会选择该文件名。

为了确定非空文件名列表中的最佳文件名,patch 首先选择路径名组件最少的所有文件名;在这些文件中,它会选择基本名最短的所有文件名;在这些文件中,它会选择最短的名称;最后,它会选择第一个剩余的文件名。

此外,如果前导垃圾信息中包含一个 Prereq: 行,patch 会获取该行中的第一个单词(通常是版本号),并检查原始文件以查看是否可以找到该单词。如果找不到,patch 会在继续操作之前要求确认。

所有这些措施的最终目的是,您应该能够运行如下 shell 命令:

patch -d /usr/src/local/blurfl

并直接从标准输入读取补丁文件,以修补 `/usr/src/local/blurfl` 目录中的文件。

如果补丁文件包含多个补丁,patch 会尝试将每个补丁应用于文件,就像它们来自单独的补丁文件一样。这意味着,其中一件事情是,必须为每个差异列表确定要修补的文件名,并且补丁文件之前的垃圾信息包含有趣的内容,例如文件名和修订级别,如前所述。

选项

-b 或 --backup
创建备份文件。也就是说,在修补文件时,重命名或复制原始文件,而不是删除它。有关如何确定备份文件名的详细信息,请参阅 -V 或 --version-control 选项。

--backup-if-mismatch
如果补丁与文件不完全匹配,并且没有要求进行其他备份,则备份文件。除非 `patch` 符合 POSIX 标准,否则这是默认设置。

--no-backup-if-mismatch
如果补丁与文件不完全匹配,并且没有要求进行其他备份,则不备份文件。如果 `patch` 符合 POSIX 标准,则这是默认设置。

-B pref 或 --prefix=pref
使用简单方法来确定备份文件名(请参阅 -V 方法或 --version-control 方法选项),并在生成备份文件名时,将 `pref` 附加到文件名。例如,使用 -B /junk/,对于文件 `src/patch/util.c`,简单的备份文件名将是 `/junk/src/patch/util.c`。

--binary
将所有文件以二进制模式写入,除了标准输出和 `/dev/tty`。在读取时,禁用将 CRLF 换行符转换为 LF 换行符的启发式方法。在 POSIX 系统上应用由非 POSIX 系统生成的补丁到非 POSIX 文件时,需要此选项。(在 POSIX 系统上,文件读取和写入绝不会转换换行符。在 Windows 上,读取和写入默认会转换换行符,并且应使用 `diff --binary` 生成补丁,以便在换行符有意义时进行转换。)

-c 或 --context
将补丁文件解释为普通的上下文差异。

-d dir 或 --directory=dir
立即更改为目录 `dir`,然后再执行任何其他操作。

-D define  或  --ifdef=define

使用 #ifdef ... #endif 结构来标记更改,以 define 作为区分符号。

--dry-run

打印应用补丁的结果,但不实际更改任何文件。

-e  或  --ed

将补丁文件解释为 ed 脚本。

-E  或  --remove-empty-files

删除应用补丁后为空的输出文件。通常此选项 是不必要的,因为 patch 可以检查头部的時間戳来确定 文件在打补丁后是否应该存在。但是,如果输入不是上下文 diff,或者 patch 符合 POSIX 标准,除非给出此选项,否则 patch 不会删除空的已打补丁文件。 当 patch 删除文件时,它还会尝试删除任何空的父目录。

-f  或  --force

假设用户确切知道自己在做什么,并且不询问任何问题。 跳过那些头部没有说明要修补哪个文件的补丁;即使 补丁中的 Prereq: 行版本错误,也修补文件;并且即使补丁看起来是反向的, 也假设它们没有反转。此选项不会抑制注释;为此请使用 -s。

-F num  或  --fuzz=num

设置最大模糊因子。此选项仅适用于有上下文的 diff,并会使 patch 在寻找安装块的位置时忽略最多指定行数的上下文。 请注意,较大的模糊因子会增加错误补丁的几率。默认模糊因子 为 2。大于或等于上下文 diff 中上下文行数 (通常为 3)的模糊因子会忽略所有上下文。

-g num  或  --get=num

此选项控制当文件受 RCS 或 SCCS 控制,且不存在 或为只读并与默认版本匹配,或者文件受 ClearCase 或 Perforce 控制且不存在时 patch 的行为。如果 num 为正数,patch 会从 版本控制系统获取(或检出)文件;如果为零,patch 会忽略 RCS、ClearCase、Perforce 和 SCCS, 并且不获取文件;如果为负数,patch 会询问用户是否获取文件。 此选项的默认值由环境变量 PATCH_GET 的值给出(如果已设置); 如果未设置,则默认值为零。

--help

打印选项摘要并退出。

-i patchfile  或  --input=patchfile

从 patchfile 中读取补丁。如果 patchfile 为 -,则从标准输入读取,这是默认行为。

-l  或  --ignore-whitespace

松散匹配模式,以防文件中的制表符或空格被弄乱。补丁文件中的 任何一個或多個空白序列匹配原始文件中的任何序列, 并且行尾的空白序列将被忽略。普通字符仍必须精确匹配。 上下文的每一行仍必须匹配原始文件中的一行。

--merge 或 --merge=merge 或 --merge=diff3

将补丁文件合并到原始文件中,类似于 diff3(1) 或 merge(1)。如果发现冲突, patch 会输出警告并用 <<<<<<< 和 >>>>>>> 行将冲突括起来。 典型的冲突如下所示:


<<<<<<<
来自原始文件的行
|||||||
补丁中的原始行
=======
来自补丁的新行
>>>>>>>

--merge 的可选参数确定冲突的输出格式:diff3 格式显示带有补丁中原始行的 ||||||| 部分;在合并格式中,该部分缺失。合并格式是默认格式。

此选项意味着 --forward,并且不考虑 --fuzz=num 选项。

-n 或 --normal

将补丁文件解释为普通的 diff。

-N 或 --forward

当补丁无法应用时,patch 通常会通过尝试反向应用第一个块来检查补丁是否看起来已经被应用。--forward 选项可以防止这种情况。请参阅 -R。

-o outfile 或 --output=outfile

将输出发送到 outfile,而不是直接修补文件。如果 outfile 是要修补的文件之一,请不要使用此选项。当 outfile 为 - 时,将输出发送到标准输出,并将通常发送到标准输出的任何消息发送到标准错误。

-pnum 或 --strip=num

从补丁文件中找到的每个文件名的最小前缀中删除包含 num 个前导斜杠。一个或多个相邻的斜杠序列被计为一个斜杠。这控制着如何处理补丁文件中找到的文件名,以防你将文件保存在与发送补丁的人不同的目录中。例如,假设补丁文件中的文件名是:

/u/howard/src/blurfl/blurfl.c

设置 -p0 会给出未修改的整个文件名,-p1 会给出:

u/howard/src/blurfl/blurfl.c

不带前导斜杠,-p4 会给出:

blurfl/blurfl.c

而不指定 -p 会给出 blurfl.c。无论你最终得到什么,都将在当前目录或 -d 选项指定的目录中进行查找。

--posix

更严格地符合 POSIX 标准,如下所示。

从列表中选择第一个现有文件(旧文件、新文件、索引文件),以根据 diff 标头推断文件名。

修补后,不要删除空文件。

不要询问是否从 RCS、ClearCase、Perforce 或 SCCS 中获取文件。

要求所有选项都先于命令行中的文件。

当存在不匹配时,不要备份文件。

--quoting-style=word

使用 style word 来引用输出名称。该单词应该是以下之一:

literal

按原样输出名称。

shell 如果名称包含 shell 元字符或会导致输出模糊,则为 shell 引用名称。

shell-always

即使通常不需要引用,也为 shell 引用名称。

c 像引用 C 语言字符串一样引用名称。

escape 像使用 c 一样进行引用,但省略周围的双引号字符。

你可以使用环境变量 QUOTING_STYLE 指定 --quoting-style 选项的默认值。如果未设置该环境变量,则默认值为 shell。


-r rejectfile 或 --reject-file=rejectfile

将被拒绝的部分放入 rejectfile 中,而不是默认的 .rej 文件。当 rejectfile 为 - 时,丢弃被拒绝的部分。

-R 或 --reverse

假设此补丁是在将旧文件和新文件互换后创建的。(是的,我担心这种情况偶尔会发生,毕竟人性如此。)patch 会尝试交换每个代码块,然后再应用它。被拒绝的部分将以交换后的格式输出。-R 选项不适用于 ed 格式的差异脚本,因为没有足够的信息来重建反向操作。

如果补丁中的第一个代码块失败,patch 会尝试反转该代码块,以查看是否可以应用。如果可以,系统会询问你是否希望设置 -R 选项。如果不能,补丁将继续以正常方式应用。(注意:此方法无法检测到反向补丁,如果它是普通差异,并且第一个命令是追加(即,它应该是删除),因为追加总是会成功,因为空上下文可以在任何地方匹配。幸运的是,大多数补丁会添加或更改行,而不是删除它们,因此大多数反向普通差异会从删除开始,这会导致失败,从而触发启发式方法。)

--read-only=behavior

尝试修改只读文件时,根据请求执行以下操作:忽略潜在问题、发出警告(默认)或失败。

--reject-format=format

以指定的格式生成拒绝文件(可以是上下文格式或统一格式)。如果没有此选项,则被拒绝的代码块将以统一差异格式输出,如果输入补丁是该格式,否则以普通上下文差异格式输出。

-s 或 --silent 或 --quiet

静默工作,除非发生错误。

--follow-symlinks

查找输入文件时,跟踪符号链接。替换符号链接,而不是修改符号链接指向的文件。Git 风格的补丁不再适用于符号链接。此选项是为了与早期版本的 patch 保持向后兼容;不建议使用它。

-t 或 --batch

禁止诸如 -f 之类的提示,但进行一些不同的假设:跳过补丁标头不包含文件名的补丁;跳过补丁,如果文件与补丁中 Prereq 行中的版本不匹配;并假设如果补丁看起来像是反向的,则将其反向。

-T 或 --set-time

从上下文差异标头中给定的时间戳中设置已修补文件的修改和访问时间。除非在时间戳中指定,否则假设上下文差异标头使用本地时间。

不建议将此选项与不包含时区的时间戳一起使用,因为使用本地时间的补丁不能轻易地被其他时区的人使用,并且在本地时钟在日光节约时间调整期间向后移动时,本地时间戳是模棱两可的。确保时间戳包含时区,或者生成使用 UTC 的补丁,并使用 -Z 或 --set-utc 选项。


-u 或 --unified

将补丁文件解释为统一上下文差异。

-v 或 --version

打印补丁的修订头和补丁级别,然后退出。

-V method 或 --version-control=method

使用 method 来确定备份文件的名称。 method 的值类似于 GNU Emacs 的 version-control 变量; patch 还可以识别更具描述性的同义词。 method 可以通过 PATCH_VERSION_CONTROL(或者,如果未设置,则通过 VERSION_CONTROL)环境变量来指定,该环境变量会被此选项覆盖。 method 不影响是否创建备份文件;它仅影响任何创建的备份文件的名称。

method 的有效值是(可以使用唯一的缩写):

existing 或 nil

为已经存在备份文件的文件创建编号的备份,否则创建简单的备份。 这是默认设置。

numbered 或 t

创建编号的备份。编号备份文件的名称为 F.~N~,其中 N 是版本号。

simple 或 never

创建简单的备份。 -B 或 --prefix、-Y 或 --basename-prefix 和 -z 或 --suffix 选项指定简单的备份文件名。如果未提供这些选项中的任何一个,则使用简单的备份后缀;如果设置了 SIMPLE_BACKUP_SUFFIX 环境变量,则使用该环境变量的值,否则使用 .orig。

对于编号或简单的备份,如果备份文件名太长,则使用备份后缀 ~;如果即使附加 ~ 也会使名称太长,则用 ~ 替换文件名中的最后一个字符。

--verbose

输出有关正在执行的工作的额外信息。

-x num 或 --debug=num

设置仅对 patch 补丁程序有意义的内部调试标志。

-Y pref 或 --basename-prefix=pref

使用 simple 方法来确定备份文件的名称(请参阅 -V method 或 --version-control method 选项),并在生成备份文件名时,将 pref 作为前缀添加到文件名的基本名称中。 例如,使用 -Y .del/ 时,文件 src/patch/util.c 的简单备份文件名是 src/patch/.del/util.c。

-z suffix 或 --suffix=suffix

使用 simple 方法来确定备份文件的名称(请参阅 -V method 或 --version-control method 选项),并使用 suffix 作为后缀。 例如,使用 -z - 时,文件 src/patch/util.c 的备份文件名是 src/patch/util.c-。

-Z 或 --set-utc

从上下文差异头中给出的时间戳中设置已修补文件的修改和访问时间。 除非在时间戳中指定,否则假定上下文差异头使用协调世界时 (UTC,通常称为 GMT)。 另请参阅 -T 或 --set-time 选项。

-Z 或 --set-utc 和 -T 或 --set-time 选项通常不会设置文件的所有时间,如果文件的原始时间与补丁头中给出的时间不匹配,或者如果其内容与补丁不完全匹配。 但是,如果提供了 -f 或 --force 选项,则无论如何都会设置文件时间。


由于 diff 输出格式的限制,以下选项无法更新内容未更改的文件的时间。此外,如果您使用这些选项,您应该删除(例如,使用 make clean)所有依赖于已打补丁文件的文件,以便后续的 make 命令不会因为已打补丁文件的修改时间而产生混淆。

环境

`PATCH_GET`

这指定了 patch 是否默认从 RCS、ClearCase、Perforce 或 SCCS 获取缺失或只读文件;请参阅 -g--get 选项。

`POSIXLY_CORRECT`

如果设置,patch 默认会更严格地符合 POSIX 标准;请参阅 --posix 选项。

`QUOTING_STYLE`
`--quoting-style` 选项的默认值。

`SIMPLE_BACKUP_SUFFIX`

用于简单备份文件名的扩展名,而不是 .orig

`TMPDIR`、`TMP`、`TEMP`

用于放置临时文件的目录;patch 使用此列表中设置的第一个环境变量。如果都没有设置,则默认值取决于系统;通常在 Unix 主机上为 /tmp

`VERSION_CONTROL` 或 `PATCH_VERSION_CONTROL`

选择版本控制风格;请参阅 -v--version-control 选项。

文件

`$TMPDIR/p*`

临时文件

`/dev/tty`

控制终端;用于获取用户提出的问题的答案

参见

diff(1)、ed(1)merge(1)

马歇尔·T·罗斯和埃纳尔·A·斯特弗鲁德,《消息封装的建议标准》,互联网 RFC 934 [https://datatracker.ietf.org/doc/html/rfc934](1985-01)。

补丁发送者的注意事项

如果您要发送补丁,请记住以下几点。

系统地创建您的补丁。在使用版本控制系统时,这应该很容易;例如,使用 Git,您可以使用 git diff。否则,一个好的方法是使用命令 diff -Naur old new,其中 oldnew 分别标识旧目录和新目录。oldnew 名称不应包含任何斜杠。

如果补丁应同时传递文件时间戳和文件内容,则其 diff 命令的标题应使用传统 Unix 格式,以通用时间显示日期和时间,以便补丁接收者可以使用 -Z--set-utc 选项。以下是一个生成此类标题的示例命令,使用 Bourne shell 语法:

LC_ALL=C TZ=UTC0 diff -Naur myprog-2.7 myprog-2.8

告诉您的接收者如何应用补丁,即告诉他们要切换到哪个目录以及使用哪些补丁选项。建议使用选项字符串 -Np1。通过假装是接收者并将您的补丁应用于原始文件的副本来测试您的过程。

您可以保存用户大量时间和精力,方法是维护一个 patchlevel.h 文件,该文件将在您发送的补丁文件中的第一个 diff 中进行修改,以增加补丁级别。如果您在补丁中放置一个 Prereq: 行,它将阻止他们在不发出任何警告的情况下按错误的顺序应用补丁。


你可以通过发送一个 diff 来创建一个文件,该 diff 将 /dev/null 或一个空文件(时间戳为 Epoch,即 1970-01-01 00:00:00 UTC)与你想要创建的文件进行比较。这仅适用于目标目录中不存在你要创建的文件。相反,你可以通过发送一个上下文 diff 来删除一个文件,该 diff 将要删除的文件与一个空文件(时间戳为 Epoch)进行比较。除非 patch 符合 POSIX 标准,并且未提供 -E--remove-empty-files 选项,否则该文件将被删除。生成用于创建和删除文件的补丁的一个简单方法是使用 GNU diff 的 -N--new-file 选项。

如果接收者应该使用 -pN 选项,请不要发送如下的输出:

diff -Naur v2.0.29/prog/README prog/README
--- v2.0.29/prog/README   Mon Mar 10 15:13:12 2024
+++ prog/README   Mon Mar 17 14:58:22 2024

因为这两个文件名具有不同数量的斜杠,并且不同版本的 patch 对文件名有不同的解释。为了避免混淆,请发送如下的输出:

diff -Naur v2.0.29/prog/README v2.0.30/prog/README
--- v2.0.29/prog/README   Mon Mar 10 15:13:12 2024
+++ v2.0.30/prog/README   Mon Mar 17 14:58:22 2024

避免发送比较备份文件名的补丁,例如 README.orig,因为这可能会导致 patch 错误地修补备份文件而不是实际文件。相反,请发送比较不同目录中相同基本文件名的补丁,例如 old/READMEnew/README

请注意不要发送反向补丁,因为这会让人怀疑他们是否已经应用了该补丁。

尽量避免修改派生文件(例如,configure 文件,其中有一行 configure: configure.ac 在你的 makefile 中),因为接收者应该能够重新生成这些派生文件。如果必须发送派生文件的 diff,请使用 UTC 生成 diff,让接收者使用 -Z--set-utc 选项应用补丁,并删除任何依赖于已修补文件的未修补文件(例如,使用 make clean)。

虽然你可以将 582 个 diff 列表放在一个文件中,但最好将相关的补丁分组到单独的文件中,以防出现问题。

诊断

诊断通常表明 patch 无法解析你的补丁文件。

如果提供了 --verbose 选项,则消息“Hmm...”表示补丁文件中存在未处理的文本,并且 patch 正在尝试推断其中是否包含补丁,如果是,则推断是什么类型的补丁。

如果所有块都成功应用,则 patch 的退出状态为 0;如果某些块无法应用或存在合并冲突,则为 1;如果存在更严重的问题,则为 2。在循环中应用一组补丁时,你应该检查此退出状态,以避免将后续补丁应用于部分已修补的文件。

注意事项

上下文 diff 无法可靠地表示创建或删除空文件、空目录或特殊文件(如符号链接)。 它们也不能表示文件元数据(如所有权、权限或一个文件是否是另一个文件的硬链接)的变化。 如果也需要这些更改,则应提供单独的指令(例如,shell 脚本)来完成这些操作。


补丁程序无法确定 ed 脚本中的行号是否错误,并且仅当它发现更改或删除时,才能检测到普通 diff 中的错误行号。 使用模糊因子 3 的上下文 diff 可能存在相同的问题。 在这些情况下,您最好进行上下文 diff,以查看所做的更改是否有意义。 当然,如果没有错误地编译,这表明补丁程序有效,但并非总是如此。

补丁程序通常会产生正确的结果,即使它需要进行大量的猜测。 但是,只有当补丁程序应用于与生成补丁程序时完全相同的文件的版本时,结果才能保证是正确的。

兼容性问题

POSIX 标准指定了与 GNU 补丁程序不同的行为。

在不使用 -b 选项的情况下,POSIX 补丁程序在发生不匹配时不会创建备份。 在 GNU 补丁程序中,可以通过使用 --no-backup-if-mismatch 选项,或者通过使用 --posix 选项或设置 POSIXLY_CORRECT 环境变量来启用此行为,从而符合 POSIX 标准。

当从补丁程序头中推断要修补的文件名时,补丁程序使用一种复杂的、可选的符合 POSIX 标准的方法。 如果上下文 diff 头和 Index 行中的文件名在去除前缀后都相同,则该方法等效于 POSIX。 如果每个标头的文件名都包含相同数量的斜杠,则您的补丁程序通常是兼容的。

在发送旨在由运行 GNU 补丁程序或符合 POSIX 标准的补丁程序的用户执行的指令时,请将自己限制在以下选项中。 以下列表中的空格是可选的。

-b
-c
-d dir
-D define
-e
-i patchfile
-l
-n
-N
-o outfile
-p num
-R
-r rejectfile
-u

错误

请通过电子邮件将错误报告到 <__>。

如果代码已复制(例如,使用 #ifdef OLDCODE ... #else ... #endif),补丁程序无法修补这两个版本,并且,如果它能够工作,很可能会修补错误的那个,并且还会告诉你它已经成功。

如果您应用了已经应用的补丁程序,补丁程序会认为它是一个反向补丁程序,并会提供撤销该补丁程序。 这可以被认为是特性。

计算如何合并一个块比使用标准的模糊算法要困难得多。 较大的块、更多的上下文、与原始位置的更大的偏移以及较差的匹配都会降低算法的速度。

复制

版权所有 © 1989–2025 自由软件基金会。 版权所有 © 1984–1986、1988 劳里·沃。

允许制作和分发本手册的逐字副本,前提是所有副本上都保留版权声明和本许可声明。


允许复制和分发本手册的修改版本,条件与逐字复制的条件相同,前提是整个生成的派生作品必须根据与此相同的许可通知进行分发。 允许将本手册翻译成另一种语言并进行分发,条件与上述修改版本的条件相同,但此许可通知可以包含在版权所有者批准的翻译版本中,而不是包含在原始英文版本中。

作者

Larry Wall 编写了 patch 的原始版本。Paul Eggert 移除了 patch 的任意限制;增加了对二进制文件、设置文件时间和删除文件的支持;并使其更好地符合 POSIX 标准。其他贡献者包括 Wayne Davison,他增加了 unidiff 支持,以及 David MacKenzie,他增加了配置和备份支持。Andreas Gruenbacher 增加了合并支持。