Comment créer un patch en ignorant les différences d'indentation dans le code?

J'essaie de créer un file patch en utilisant l'outil diff.Mais face à des problèmes.La façon dont je fais est ci-dessous.

J'ai créé un directory nommé a et y placer le file original.

a/original_file.c 

Maintenant, j'ai créé d'autres directory nommé b et mettre le même file avec du contenu modifié.

 b/original_file.c 

Maintenant, le contenu du file b/original_file.c que j'ai copié à partir d'Internet et le mettre dans un éditeur de text.

Après avoir donné la command: diff -Naur ab > patch_file.patch , le file patch_file.patch est généré et comporte des modifications non patch_file.patch (liées à l'indentation).

Par exemple:

 return mg_nw (MG_READY_NOY, &rmsg, seqnr, - sizeof (struct mg_rdy_notify)); + sizeof (struct mg_rdy_notify)); 

Maintenant vous pouvez voir qu'il y a des changements liés à l'indentation où sizeof (struct mg_rdy_notify)) est remplacé par same sizeof (struct mg_rdy_notify)) mais une base d'indentation qui est ce que nous ne voulons pas.

diff a plus d'une option liée aux espaces. Cependant, on est less 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. 

Habituellement, on utilise -b , parce que cela est less susceptible d'ignorer les changements significatifs. Si vous n'avez modifié que l'indentation, les deux -b et -w donnent le même résultat. Par contre, si vous avez inséré des espaces 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, l'option -w vous permet d'ignorer la modification du paramètre setlocale (peut-être pas ce qui était prévu).

POSIX diff , d'ailleurs, a seulement l'option -b .

Pour le patch , POSIX documente l'option -l :

-l
(La lettre ell .) Cause toute séquence de caractères <blank> dans le script de différence pour correspondre à une séquence de caractères <blank> dans le file d'input. Les autres caractères doivent correspondre exactement.

diff a une option pour ignorer les changements d'espace ( -w ), même pour le patch ( -l ). En général, c'est une mauvaise idée d'ignorer les espaces blancs, donc vous devriez réserver son utilisation pour des cas spéciaux, quand l'éditeur de quelqu'un a fait quelque chose d'horrible …