Skip to content

Commit

Permalink
docs: add Helping patch Find Inexact Matches
Browse files Browse the repository at this point in the history
Signed-off-by: jingfelix <jingfelix@outlook.com>
  • Loading branch information
jingfelix committed Mar 13, 2024
1 parent 790321b commit 782c99d
Showing 1 changed file with 17 additions and 0 deletions.
17 changes: 17 additions & 0 deletions articles/帮助 patch 查找不精确的匹配.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
> 本文是对[这篇 diff 文档](https://www.gnu.org/software/diffutils/manual/html_node/Inexact.html)的翻译
对于上下文差异和长度较小的正常补丁,`patch` 可以检测 patch 中的行号何时是不正确的,并且会尝试找到应用每个 hunk 的正确位置。
第一次尝试时,`patch` 会使用 hunk 的原有行号加上或减去应用先前的 hunk 产生的偏移。如果这不是正确的位置,`patch` 会分别向前向后扫描来寻找和 hunk 中的上下文匹配的位置。

首先,`patch` 寻找上下文的所有行都能匹配上的位置。如果找不到这样的位置,并且 `patch` 读取的是上下文补丁或标准补丁,同时最大模糊参数(fuzz factor)被设置为大于等于1,
`patch` 会进行下一次扫描。本次扫描时,忽略(即不包含)上下文部分的第一行和最后一行。如果依然找不到合适的位置,且模糊参数大于等于2,则进行下一次扫描,
并忽略上下文的前两行和最后两行。如果依旧找不到且模糊参数更大,则会继续此过程。

`--fuzz=lines`(`-F lines`) 选项设置最大模糊参数为 `lines`。这个选项仅对有上下文的补丁和标准化补丁生效。`lines` 代表在搜索应用 hunk 的位置时最大忽略的上下文行数。
注意,较大的模糊参数将会增加补丁应用出错的概率。默认的模糊参数为2。将其设置为超过 `diff` 上下文的值(一般为3)是没有意义的。

如果 `patch` 找不到应用 hunk 的位置,则它会将无法应用的 hunk 写入对应的拒绝文件(.rej)文件。无论补丁是什么格式,拒绝文件都会以上下文格式写入无法应用的 hunk。
拒绝文件中的行号与 patch 文件中的行号不同:它显示的是`patch`认为失败的 hunk 在新文件中的大致位置。

如果使用了`--verbose`选项,那么 `patch` 将会在运行结束时给出一些关于失败和成果的更详细的信息。如果应用 hunk 失败了,则会打印出 `patch` 认为 hunk 在新文件中应该在哪一行。
如果这与 diff 中指定的行号不一致,则会打印出偏移量。如果某个偏移量过大,则该 hunk 应用的位置可能是错误的。`patch` 还会指出它在应用时是否使用了模糊因子进行匹配。

0 comments on commit 782c99d

Please sign in to comment.