我正在尝试使用 diff 工具创建补丁文件。但面临一个问题。我正在做的方式如下。
我创建了一个名为 a 的目录,并将原始文件放入其中。
a/original_file.c
现在我创建了另一个名为 b 的目录,并将修改内容的相同文件放入其中。
b/original_file.c
现在我从互联网复制了文件内容b/original_file.c
并将其放入某个文本编辑器中。
发出命令:后diff -Naur a b > patch_file.patch
,将生成文件patch_file.patch
,并且它有一些不需要的更改(与缩进有关)。
例如:
return mg_nw (MG_READY_NOY, &rmsg, seqnr,
- sizeof (struct mg_rdy_notify));
+ sizeof (struct mg_rdy_notify));
现在您可以看到与缩进相关的更改,其中sizeof (struct mg_rdy_notify))
被替换为相同sizeof (struct mg_rdy_notify))
但一个缩进基础,这是我们不想要的。
答案1
diff
有不止一个与空白相关的选项。然而,对于补丁来说,它的用处不大。手册页给出了一个晦涩的提示,提到了两者GNU:
-B, --ignore-blank-lines
ignore changes where lines are all blank
-b, --ignore-space-change
ignore changes in the amount of white space
-w, --ignore-all-space
ignore all white space
-b Ignore changes in amount of white space.
-B Ignore changes that just insert or delete blank lines.
-w Ignore white space when comparing lines.
通常人们使用-b
,因为这样不太可能忽视重大变化。如果您仅更改了缩进,则两者-b
都会-w
给出相同的结果。另一方面,如果您在没有空格的地方插入了空格,或者删除了现有空格(不留下任何空格),则可能会更改您的程序。这是一个例子:
$ diff foo.c foo2.c
4c4
< setlocale(LC_ALL, "");
---
> setlocale(LC_ALL, " ");
6,7c6,7
< printw("\U0001F0A1");
< getch();
---
> printw ("\U0001F0A1");
> getch(); /* comment */
$ diff -b foo.c foo2.c
4c4
< setlocale(LC_ALL, "");
---
> setlocale(LC_ALL, " ");
6,7c6,7
< printw("\U0001F0A1");
< getch();
---
> printw ("\U0001F0A1");
> getch(); /* comment */
$ diff -w foo.c foo2.c
7c7
< getch();
---
> getch(); /* comment */
在这种情况下,该-w
选项允许您忽略对参数的更改setlocale
(可能不是预期的更改)。
POSIX 差异顺便说一下,只有这个-b
选项。
为了patch
,POSIX记录-l
选项:
-l
(这封信埃尔.) 使<blank>
差异脚本中的任何字符序列与<blank>
输入文件中的任何字符序列相匹配。其他字符应完全匹配。
答案2
diff
可以选择忽略空格更改 ( ),与( )-w
相同。一般来说,忽略空白不是一个好主意,所以你应该保留它在特殊情况下的使用,当某人的编辑做了一些可怕的事情时......patch
-l