코드의 들여쓰기 차이를 무시하는 패치를 만드는 방법은 무엇입니까?

코드의 들여쓰기 차이를 무시하는 패치를 만드는 방법은 무엇입니까?

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공백과 관련된 옵션이 두 개 이상 있습니다. 그러나 패치의 경우 거의 사용되지 않습니다. 매뉴얼 페이지는 두 가지를 모두 언급하는 모호한 힌트를 제공합니다.암소 비슷한 일종의 영양:

   -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

그리고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.

일반적으로 사람들은 -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

관련 정보