GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Wie erstelle ich einen Patch, der Einrückungsunterschiede im Code ignoriert?

Ich versuche, eine Patch-Datei mit dem Diff-Tool zu erstellen. Aber ich stehe vor einem Problem. Wie ich es mache, ist unten.

Ich habe ein Verzeichnis mit dem Namen a erstellt und die Originaldatei darin abgelegt.

a/original_file.c

Jetzt habe ich ein anderes Verzeichnis namens b erstellt und dieselbe Datei mit geändertem Inhalt darin abgelegt.

b/original_file.c

Jetzt Inhalt von b/original_file.c Datei, die ich aus dem Internet kopiert und in einen Texteditor eingefügt habe.

Nach Eingabe des Befehls:diff -Naur a b > patch_file.patch , die Datei patch_file.patch wird generiert und weist einige unerwünschte Änderungen auf (bezieht sich 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 sich Änderungen in Bezug auf den Einzug befinden, wobei sizeof (struct mg_rdy_notify)) wird durch denselben sizeof (struct mg_rdy_notify)) ersetzt aber eine Einrückungsbasis, die wir nicht wollen.

Akzeptierte Antwort:

diff hat mehr als eine Option in Bezug auf Leerzeichen. Allerdings ist man für Patches weniger brauchbar. Die Handbuchseite gibt einen obskuren Hinweis, der sich sowohl auf GNU:

bezieht
   -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

und 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.

Normalerweise verwendet man -b , da dadurch signifikante Änderungen weniger wahrscheinlich übersehen werden. Wenn Sie nur den Einzug geändert haben, dann beide -b und -w geben das gleiche Ergebnis. Wenn Sie andererseits Leerzeichen eingefügt haben, wo keine vorhanden waren, oder vorhandene Leerzeichen gelöscht haben (wobei keine vorhanden waren), 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 das -w Mit der Option können Sie die Änderung an setlocale ignorieren Parameter (vielleicht nicht beabsichtigt).

POSIX diff hat übrigens nur das -b Option.

Für patch , POSIX dokumentiert den -l Möglichkeit:

-l
(Der Buchstabe ell .) Verursachen Sie eine beliebige Folge von <blank> Zeichen im Differenzskript so, dass sie mit einer beliebigen Folge von <blank> übereinstimmen Zeichen in der Eingabedatei. Andere Zeichen müssen exakt abgeglichen werden.


Linux
  1. So verwenden Sie den Linux-Grep-Befehl

  2. So verwenden Sie den Verlaufsbefehl unter Linux

  3. So erstellen Sie einen Alias ​​und verwenden den Alias-Befehl in Linux

  4. Wie kodiere ich ein Linux-Kernel-Modul?

  5. Wie erstelle ich einen Patch, der Einrückungsunterschiede im Code ignoriert?

So erstellen Sie Partitionen unter Linux

So erstellen Sie symbolische Links in Linux

So erstellen Sie eine Datei unter Linux

So erstellen Sie Verknüpfungen auf dem Linux-Desktop

So erstellen Sie einen SSH-Alias ​​unter Linux

So erstellen Sie einen Alias ​​unter Linux