
Я пытаюсь создать патч для файла с помощью инструмента сравнения. Но столкнулся с проблемой. Ниже приведен способ, которым я это делаю.
Я создал один каталог с именем 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
-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
). В общем, игнорировать пробелы — плохая идея, поэтому вам следует приберечь ее использование для особых случаев, когда чей-то редактор сделал что-то ужасное...