
我正在嘗試使用 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