J'essaie de créer un correctif pour un fichier à l'aide de l'outil diff.Mais je suis confronté à un problème.La façon dont je procède est ci-dessous.
J'ai créé un répertoire nommé a et j'y ai placé le fichier d'origine.
a/original_file.c
Maintenant, j'ai créé un autre répertoire nommé b et j'y ai mis le même fichier avec le contenu modifié.
b/original_file.c
Maintenant contenu de b/original_file.c
fichier que j'ai copié depuis Internet et que j'ai mis dans un éditeur de texte.
Après avoir donné la commande :diff -Naur a b > patch_file.patch
, le fichier patch_file.patch
est généré et il a des changements indésirables (c'est lié à l'indentation).
Par exemple :
return mg_nw (MG_READY_NOY, &rmsg, seqnr,
- sizeof (struct mg_rdy_notify));
+ sizeof (struct mg_rdy_notify));
Vous pouvez maintenant voir qu'il y a des changements liés à l'indentation où sizeof (struct mg_rdy_notify))
est remplacé par le même sizeof (struct mg_rdy_notify))
mais une base d'indentation qui est ce que nous ne voulons pas.
Réponse acceptée :
diff
a plus d'une option liée aux espaces blancs. Cependant, on est moins utile pour les patchs. La page de manuel donne un indice obscur, se référant à la fois à 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
et 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.
Généralement on utilise -b
, car cela est moins susceptible de négliger des changements importants. Si vous n'avez changé que l'indentation, alors -b
et -w
donner le même résultat. D'un autre côté, si vous avez inséré des espaces là où il n'y en avait pas, ou supprimé des espaces existants (en n'en laissant aucun), cela pourrait être un changement dans votre programme. Voici un exemple :
$ 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 */
Dans ce cas, le -w
L'option vous permet d'ignorer le changement de setlocale
paramètre (peut-être pas ce qui était prévu).
POSIX diff, soit dit en passant, n'a que le -b
option.
Pour patch
, POSIX documente le -l
choix :
-l
(La lettre ell .) Cause toute séquence de<blank>
caractères dans le script de différence pour correspondre à n'importe quelle séquence de<blank>
caractères dans le fichier d'entrée. Les autres caractères doivent correspondre exactement.