
Ich versuche, mit dem Diff-Tool eine Patch-Datei zu erstellen, stoße aber auf Probleme. Nachfolgend meine Vorgehensweise.
Ich habe ein Verzeichnis mit dem Namen „a“ erstellt und die Originaldatei dort abgelegt.
a/original_file.c
Jetzt habe ich ein anderes Verzeichnis mit dem Namen b erstellt und dieselbe Datei mit geändertem Inhalt dort abgelegt.
b/original_file.c
Nun b/original_file.c
habe ich den Dateiinhalt aus dem Internet kopiert und in einen Texteditor eingefügt.
Nach Eingabe des Befehls: wird diff -Naur a b > patch_file.patch
die Datei patch_file.patch
generiert und weist einige unerwünschte Änderungen auf (bezogen auf die Einrückung).
Zum Beispiel:
return mg_nw (MG_READY_NOY, &rmsg, seqnr,
- sizeof (struct mg_rdy_notify));
+ sizeof (struct mg_rdy_notify));
Jetzt können Sie sehen, dass es Änderungen in Bezug auf die Einrückung gibt, die durch dieselbe , aber eine Einrückungsbasis sizeof (struct mg_rdy_notify))
ersetzt wird , was wir nicht wollen.sizeof (struct mg_rdy_notify))
Antwort1
diff
hat mehr als eine Option im Zusammenhang mit Leerzeichen. Eine davon ist jedoch für Patches weniger nützlich. Die Manualpage gibt einen obskuren Hinweis, der sich auf beide beziehtGNU:
-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
UndFreeBSD
-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.
Normalerweise verwendet man -b
, weil so die Wahrscheinlichkeit geringer ist, dass wesentliche Änderungen übersehen werden. Wenn Sie nur die Einrückung geändert haben, führen sowohl als auch -b
zum -w
gleichen Ergebnis. Wenn Sie andererseits Leerzeichen eingefügt haben, wo keine waren, oder vorhandene Leerzeichen gelöscht haben (und keines übrig gelassen haben), könnte dies eine Änderung in Ihrem Programm sein. Hier ist ein Beispiel:
$ 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 */
In diesem Fall können Sie mit dieser Option die (möglicherweise nicht beabsichtigte) -w
Änderung des Parameters ignorieren .setlocale
POSIX-Diffhat übrigens nur die -b
Option.
Für patch
,POSIXdokumentiert die -l
Option:
-l
(Der Buchstabeell.) Jede Zeichenfolge<blank>
im Differenzskript muss mit jeder Zeichenfolge<blank>
in der Eingabedatei übereinstimmen. Andere Zeichen müssen exakt übereinstimmen.
Antwort2
diff
hat eine Option zum Ignorieren von Leerzeichenänderungen ( -w
), dasselbe gilt für patch
( -l
). Generell ist es jedoch keine gute Idee, Leerzeichen zu ignorieren, daher sollten Sie ihre Verwendung Sonderfällen vorbehalten, wenn der Redakteur von jemandem etwas Schreckliches getan hat ...