コード内のインデントの違いを無視してパッチを作成するにはどうすればよいですか?

コード内のインデントの違いを無視してパッチを作成するにはどうすればよいですか?

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

のためにpatchPOSIXオプションを文書化します-l:

-l
(手紙エル.)<blank>差分スクリプト内の任意の文字シーケンスを<blank>入力ファイル内の任意の文字シーケンスに一致させます。その他の文字は完全に一致します。

答え2

diffには空白の変更を無視するオプション ( -w) があり、patch( -l) も同様です。ただし、一般的には空白を無視するのはよくないので、誰かのエディターが何かひどいことをしたときなど、特別な場合にのみ使用してください...

関連情報