Snažím se vytvořit záplatu souboru pomocí nástroje diff. Ale čelím problémům. Způsob, jakým to dělám, je níže.
Vytvořil jsem jeden adresář s názvem a a vložil jsem do něj původní soubor.
a/original_file.c
Nyní jsem vytvořil další adresář s názvem b a vložil jsem do něj stejný soubor s upraveným obsahem.
b/original_file.c
Nyní obsah b/original_file.c
soubor jsem zkopíroval z internetu a vložil do nějakého textového editoru.
Po zadání příkazu:diff -Naur a b > patch_file.patch
, soubor patch_file.patch
je generován a má nějaké nežádoucí změny (souvisí s odsazením).
Například:
return mg_nw (MG_READY_NOY, &rmsg, seqnr,
- sizeof (struct mg_rdy_notify));
+ sizeof (struct mg_rdy_notify));
Nyní můžete vidět, že došlo ke změně související s odsazením, kde sizeof (struct mg_rdy_notify))
je nahrazena stejnou sizeof (struct mg_rdy_notify))
ale jeden základ odsazení, což je to, co nechceme.
Přijatá odpověď:
diff
má více než jednu možnost související s mezerami. Jeden je však méně užitečný pro záplaty. Manuálová stránka poskytuje nejasnou nápovědu, která se týká obou 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
a 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.
Obvykle se používá -b
, protože je méně pravděpodobné, že přehlédnete významné změny. Pokud jste změnili pouze odsazení, pak obě -b
a -w
dát stejný výsledek. Na druhou stranu, pokud jste vložili mezery tam, kde žádné nebyly, nebo smazali existující mezery (nenechali žádné), může to být změna ve vašem programu. Zde je příklad:
$ 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 */
V tomto případě -w
volba umožňuje ignorovat změnu setlocale
parametr (možná ne to, co bylo zamýšleno).
POSIX diff, mimochodem, má pouze -b
možnost.
Pro patch
, POSIX dokumentuje -l
možnost:
-l
(písmeno ell .) Způsobí libovolnou sekvenci<blank>
znaky v rozdílovém skriptu, aby odpovídaly jakékoli sekvenci<blank>
znaků ve vstupním souboru. Ostatní znaky se musí přesně shodovat.