使用 diff/patch 创建/应用补丁时忽略某些行?

使用 diff/patch 创建/应用补丁时忽略某些行?

文件A

Apples
Bananas
Clementines
Dates

文件B

Apples
Blueberries
Cherries
Dates

我想比较 A 和 B 来生成一个补丁,当应用于 C 时会更改该行Clementines > Cherries,但会忽略第二行(蓝莓/黑醋栗/其他)。

文件C(补丁前)

Apples
Blackcurrants
Clementines
Dates

文件C(补丁后)

Apples
Blackcurrants
Cherries
Dates

理想情况下,我想要一个带有上下文的补丁,因为不能保证该序列始终出现在文件中的同一位置。在我看来,上下文将包含某种形式的通配符行 afterApples和 before Clementines

如果有必要,我愿意手动编辑diff输出,但是如果有一个可重复的命令来创建基于上下文的差异,并使用通配符代替特定的正则表达式匹配,那就太好了。

我希望能够将此补丁发送给拥有文件 C 的朋友,并让他们运行命令,patch而无需手动编辑任何内容。

如何才能做到这一点?

答案1

假设您正在使用 GNU diff,则无法让它生成您想要的确切补丁。可以要求diff忽略与给定正则表达式匹配的行,-I选项,但它只会忽略仅包含此类更改的整个块。在这种情况下,任何大块头(即使没有上下文)都会更改“香蕉”和“克莱门汀”行。

一种不涉及花哨的补丁编辑的可能性是要求diff生成一个ed脚本:

diff -e

这将产生

2,3c
Blueberries
Cherries
.

可以对其进行修改以生成您想要的补丁:

3,3c
Cherries
.

答案2

如果这样做patch(1),不适合的部分将保存在拒绝文件中。然后你可以检查一下那个并申请(或不申请)那些没有进入的帅哥。

另一种可能性(对于铁杆运动员)是只编辑补丁。请注意,该diff(1)格式是为了可读性而设计的,不是进行编辑。您必须小心,不要弄乱行号或其他标记。

如果您想创建一个用于分发的补丁,也许最简单的路径是按原样应用补丁,编辑生成的文件以进行品味,然后根据编辑的文件重做补丁。

相关内容