如何创建忽略代码中缩进差异的补丁?

Ram*_*Ram 8 linux diff patch

我正在尝试使用 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))的缩进基础,这是我们不想要的。

Tho*_*key 9

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)

FreeBSD

   -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>字符序列与输入文件中的任何字符序列匹配。其他字符应完全匹配。


fro*_*utz 8

diff有一个选项可以忽略空格更改 ( -w),与patch( -l)相同。一般来说,忽略空格是一个坏主意,因此您应该将其保留用于特殊情况,当某人的编辑器做了一些可怕的事情时......