
diff ツールを使用してファイルにパッチを作成しようとしていますが、問題が発生しています。私が行っている方法は次のとおりです。
「a」という名前のディレクトリを 1 つ作成し、そこに元のファイルを配置しました。
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 つの基準に置き換えられていますが、これは望ましくありません。
答え1
diff
空白に関連するオプションが複数あります。ただし、そのうちの1つはパッチにはあまり役に立ちません。マニュアルページには、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
そしてフリーBSD
-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
) も同様です。ただし、一般的には空白を無視するのはよくないので、誰かのエディターが何かひどいことをしたときなど、特別な場合にのみ使用してください...