我正在尝试使用 diff 工具创建补丁文件。但面临一个问题。我正在做的方法如下。
我创建了一个名为 a 的目录并将原始文件放入其中。
a/original_file.c
Run Code Online (Sandbox Code Playgroud)
现在我创建了另一个名为 b 的目录,并将具有修改内容的相同文件放入其中。
b/original_file.c
Run Code Online (Sandbox Code Playgroud)
现在b/original_file.c
我从互联网上复制的文件内容并将其放入一些文本编辑器中。
给出 command: 后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));
Run Code Online (Sandbox Code Playgroud)
现在您可以看到与缩进相关的更改,其中sizeof (struct mg_rdy_notify))
被替换为相同sizeof (struct mg_rdy_notify))
的缩进基础,这是我们不想要的。
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
Run Code Online (Sandbox Code Playgroud)
-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.
Run Code Online (Sandbox Code Playgroud)
通常使用-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 */
Run Code Online (Sandbox Code Playgroud)
在这种情况下,该-w
选项允许您忽略对setlocale
参数的更改(可能不是预期的)。
顺便说一句,POSIX diff只有-b
选项。
对于patch
, POSIX文档-l
选项:
-l
(字母ell。)<blank>
使差异脚本中的任何<blank>
字符序列与输入文件中的任何字符序列匹配。其他字符应完全匹配。
diff
有一个选项可以忽略空格更改 ( -w
),与patch
( -l
)相同。一般来说,忽略空格是一个坏主意,因此您应该将其保留用于特殊情况,当某人的编辑器做了一些可怕的事情时......
归档时间: |
|
查看次数: |
4665 次 |
最近记录: |