Introduction Utilisation diff et patch - Linux Academy Blog

Ce tutoriel suppose une certaine connaissance de la ligne de base Linux et commande, comme changer les répertoires, copier des fichiers et des fichiers texte d'édition.

1C1
< These are a few words.
Aucune nouvelle ligne à la fin du fichier
-
> Ce sont encore quelques mots.
Aucune nouvelle ligne à la fin du fichier

Le "<” means that patch should remove the characters after this sign, and the “>» Signifie que les caractères après ce signe doit être ajouté. Lorsque le contenu remplaçant (un « c » entre les numéros de ligne), vous verrez à la fois la < and the > signe. Lors de l'ajout de contenu ( « a » entre les numéros de ligne), vous ne verrez le signe>, et quand la suppression de contenu (un « d » entre les numéros de ligne), seule la < sign.

Le « », suivi de « No newline à la fin du fichier », est seulement là parce que je ne puis appuyez sur Entrée après avoir tapé les mots. En général, il est toujours bon d'ajouter une nouvelle ligne finale à tous les fichiers de texte que vous créez. Certains morceaux de logiciels ne peuvent pas faire sans eux. Par conséquent, l'absence d'un retour à la ligne est rapporté de façon explicite par diff. Ajout de nouvelles lignes finales aux fichiers rend la sortie beaucoup plus courte:

1C1
< These are a few words.
-
> Ce sont encore quelques mots.

Si nous voulons créer un patch, il faut mettre la sortie de diff dans un fichier. Bien sûr, vous pouvez le faire en copiant la sortie de votre console et, après le coller dans votre éditeur de texte favori, enregistrer le fichier, mais il y a un chemin plus court. Nous pouvons laisser la sortie de bash écrire diff à un fichier pour nous de cette façon:

Encore une fois, remplacer les noms de fichiers avec ceux appropiate dans votre cas. Vous pourriez savoir que dire bash pour écrire la sortie d'une commande à un fichier en utilisant> fonctionne avec toutes les commandes. Cela peut être très utile pour économiser à la sortie d'une commande dans un fichier (journal).

Toutes nos félicitations! Si diff rapporté les fichiers à être égaux, vous venez avec succès créé et utilisé un patch! Cependant, le format de patch que nous venons d'utiliser est pas le seul. Dans le chapitre suivant, je vais vous expliquer au sujet d'un autre format de patch.

Dans le premier chapitre, nous avons créé un patch en utilisant le format normal diff. Ce format, cependant, ne fournit aucune des lignes de contexte autour celles à remplacer, et par conséquent, un changement dans les numéros de ligne (un ou plusieurs sauts de ligne supplémentaires quelque part, ou quelques lignes supprimées), il serait très difficile pour le programme de patch pour déterminer les lignes à changer la place. En outre, si un autre fichier qui est patché par accident contient les mêmes lignes que le fichier original au bon endroit, patch applique joyeusement les changements du PatchFile à ce fichier. Cela pourrait se traduire par un code cassé et d'autres effets secondaires indésirables. Heureusement, diff prend en charge d'autres formats que la normale. Créons un patch pour les mêmes fichiers, mais cette fois en utilisant le format de sortie de contexte:

A l'heure actuelle, il devrait être clair que vous devez remplacer les noms de fichiers si nécessaire =). Vous devriez obtenir une sortie comme ceci:

Comme vous pouvez le voir, les noms de fichiers sont inclus. Cela nous économiser quelques secondes lors de l'application du patch. Les horodateurs vous pouvez voir à côté des noms de fichiers sont la date et l'heure de la dernière modification du fichier. La ligne de 15 * 's indique le démarrage d'un gros morceau. Un gros morceau décrit les changements, comme remplacements, ajouts et les suppressions devraient être apportées à un certain bloc de texte. Les deux numéros 1 sont les numéros de ligne (encore une fois, ceux-ci peuvent également être comprise ligne (12,15 moyen de ligne 12 à la ligne 15)), et. signifie que la ligne doit être remplacée. La ligne avec. avant que les trois -Bois (hey, où avons-nous vu ceux qui étaient avant?) devrait être remplacée par la deuxième ligne avec. après les trois -Bois (. bien sûr, lui-même ne sera pas inclus, il est la syntaxe du format de contexte).

Comme vous pouvez le voir, il n'y a pas de c, de A et d'ici s. L'action à effectuer est déterminée par le caractère en avant de la ligne. Le. comme expliqué, signifie que la ligne doit être remplacée. Les autres personnages sont disponibles +, - et » » (un espace). Le + signifie ajouter (ou ajouter), les moyens - supprimer, et le » » ne veut rien dire: patch ne l'utiliser comme contexte pour être sûr qu'il est la modification de la partie droite du fichier.

L'application de ce patch est un peu plus facile: dans les mêmes circonstances que précédemment (laisser bash écrire à nouveau la sortie de diff à un fichier, puis copiez le rustine et le fichier d'origine à un autre endroit), vous devez exécuter:

La meilleure façon d'obtenir les différences entre plusieurs fichiers est de les mettre tous dans un répertoire et de laisser diff comparer l'ensemble des répertoires. Vous pouvez simplement spécifier des répertoires plutôt que des fichiers, diff autodétectera si vous donnez un fichier ou un répertoire:

Remarque: si les répertoires que vous comparez également les sous-répertoires, vous devez ajouter l'option -r pour faire diff comparer les fichiers dans les sous-répertoires, aussi.

Cela devrait donner une sortie comme ceci:

Comme vous pouvez le voir, le format de sortie normale indique que les noms de fichiers lorsque l'on compare plusieurs fichiers. Vous pouvez également voir des exemples de l'ajout et la suppression de lignes.

Maintenant, nous allons jeter un oeil à la sortie de la même comparaison dans le format de contexte:

- Nous allons ajouter quelque chose dans ce fichier et de supprimer cette ligne.

Quelque chose sera ajouté au-dessus de cette ligne.

La première chose que vous devriez remarquer est augmentation de la longueur; le format de contexte fournit plus d'informations que le format normal. Ce n'était pas visible dans le premier exemple, car il n'y avait pas de contexte à inclure. Cependant, cette fois il y avait contexte, et que lenghtens sûrement le patch beaucoup. Vous pourriez également remarqué que les noms sont mentionnés deux fois à chaque fois. Ceci est probablement fait soit pour le rendre plus facile pour le patch de reconnaître quand commencer patcher le fichier suivant, ou pour assurer une meilleure compatibilité ascendante (ou les deux).

L'autre façon de laisser diff comparer plusieurs fichiers est en train d'écrire un script shell qui exécute diff plusieurs fois et ajoute correctement toutes les sorties vers un fichier, y compris les lignes avec les commandes diff. Je ne vais pas vous dire comment faire cela comme dans l'autre sens (mettre les fichiers dans un répertoire) est beaucoup plus facile et est largement utilisé.

La création de ce patch avec diff était considérablement facile, mais l'utilisation de coups de pied de répertoires dans un nouveau problème: patche juste patcher les fichiers mentionnés dans le répertoire de travail courant et oublier le répertoire qu'ils étaient lors de la création du patch, ou va patcher le fichiers dans les répertoires spécifiés dans le patch? Jetez un coup d'oeil au chapitre suivant pour savoir!

Dans le chapitre avant celui-ci, nous avons créé un patch qui peut être utilisé pour patcher plusieurs fichiers. Si vous ne l'avez pas déjà fait, sauf la sortie de diff à une rustine réelle d'une manière comme ceci:

Note: nous allons utiliser le patch de format de contexte ici car il est généralement préférable d'utiliser un format qui fournit le contexte.

Il est temps d'essayer d'utiliser notre rustine. Copiez le répertoire d'origine et la rustine à un autre endroit, aller à cet autre endroit, et appliquer le patch avec cette commande:

] $ Patch -i patchfile.patch

Huh? Il rend compte qu'il ne peut pas trouver le fichier patch! Oui, c'est vrai. Il essaie de trouver le fichier fichier1 dans le répertoire courant (Patch bandes loin tous les répertoires défaillant peut en face du nom de fichier). De ce fichier n'est pas là bien sûr, parce que nous essayons de mettre à jour le fichier dans le répertoire originaldirectory. Pour cette raison, nous devrions dire rustine de ne pas dépouiller de tous les répertoires dans les noms de fichiers. Cela peut se faire de cette façon:

] $ Patch -p0 -i patchfile.patch

Note: vous pourriez penser que vous pourriez tout aussi bien se déplacer dans originaldirectory et exécutez la commande patch là. Ne pas! Ceci est une mauvaise pratique: si la rustine inclut tous les fichiers de patch dans les sous-répertoires, patch chercher dans le répertoire de travail, et, évidemment, trouver pas ou trouver les mauvais. Utilisez l'option -p pour faire le look de patch dans les sous-répertoires comme il se doit.

] $ Patch -p0 R -i patchfile.patch

En général, cette opération réussira, et vous obtiendrez les fichiers originaux que vous aviez. Soit dit en passant, il y a une autre raison pour laquelle vous voudriez inverser un patch: parfois (surtout quand endormi), les gens libèrent un patch avec les fichiers échangés. Vous avez une grande chance que ce patch détecte automatiquement et vous demander si vous voulez essayer rapiéçage reversively. Parfois, cependant, patch ne détecte pas et se demander pourquoi les fichiers ne semblent pas correspondre. Vous pouvez ensuite essayer d'appliquer le patch d'une manière inverse manuellement, en passant l'option -R de patch. Il est conseillé de faire une sauvegarde avant de l'essayer, car il est possible que correctif bousille et vous laisse avec des fichiers gâtés irréparablement.

La commande diff peut également produire les différences dans un autre format: le format unifié. Ce format est plus compact, car il omet les lignes de contexte redondantes et les choses groupes comme instructions de numéro de ligne. Cependant, ce format est actuellement pris en charge uniquement par GNU diff et patch. Si vous libérant un patch dans ce format, vous devez être sûr que ce ne sera appliquée que par les utilisateurs de GNU patch. Quasiment toutes les saveurs Linux propose GNU patch.

Le format unifié est similaire au format de contexte, mais il est loin d'être exactement la même chose. Vous pouvez créer un patch dans le format unifié de cette façon:

La sortie devrait être quelque chose comme ceci:

-Nous allons ajouter quelque chose dans ce fichier et de supprimer cette ligne.

Quelque chose sera ajouté au-dessus de cette ligne.

Après avoir lu trois formats, vous vous demandez probablement lequel choisir. Voici une petite comparaison:

  • Le format normal présente la meilleure compatibilité: à peu près chaque commande diff / patch comme devrait le reconnaître. Le manque de contexte est un gros inconvénient, cependant.
  • Le format de contexte est largement pris en charge, mais pas tous les diff / commande patch comme le sait. Cependant, l'avantage de pouvoir inclure le contexte fait pour cela.
  • Le format unifié propose contexte, aussi, et est plus compact que le format de contexte, mais est uniquement pris en charge par une seule marque de commandes diff / comme correctif.

Si vous êtes sûr que le patch sera utilisé par GNU utilisateurs diff / patch uniquement unifié est le meilleur choix, car il garde votre patch le plus compact possible. Dans la plupart des autres cas, cependant, le format de contexte est le meilleur choix. Le format normal ne doit être utilisée que si vous êtes sûr qu'il ya un utilisateur sans support du format de contexte.

Il est possible de faire diff comprennent moins de lignes de contexte autour des lignes qui devraient être modifiées. Surtout dans les grandes PATCHFILES, cela peut dépouiller beaucoup d'octets et de rendre votre rustine plus portable. Toutefois, si vous incluez trop peu de lignes de contexte, correctif peut ne pas fonctionner correctement. Citant la page man diff GNU: « Pour fonctionner correctement, patch doit généralement au moins deux lignes de contexte. »

Spécification du nombre de lignes de contexte peut se faire de plusieurs façons:

  • Si vous souhaitez utiliser le format de contexte, vous pouvez combiner en une seule option, l'option -C. Exemple:
La commande ci-dessus utiliser le format de contexte avec 2 lignes de contexte.
  • Si vous souhaitez utiliser le format unifié, vous pouvez le combiner en une seule option, l'option -U. Exemple:
    La commande ci-dessus utiliser le format unifié avec 2 lignes de contexte.
  • Quel que soit le format que vous choisissez, vous pouvez spécifier le nombre de lignes comme celle-ci:

    Toutefois, cela ne fonctionnera que si vous spécifiez également un format de support contexte. Il faudrait combiner cette option soit avec -c ou -u.

  • Bien que ce tutoriel décrit beaucoup de fonctionnalités et le fonctionnement des diff et patch, il ne décrit par pas loin tout ce que vous pouvez faire avec ces outils puissants. Il est une introduction sous la forme d'un tutoriel. Si vous voulez en savoir plus sur ces commandes, vous pouvez lire, par exemple, leurs pages de manuel et la documentation de GNU sur les diff et patch.

    6 réflexions sur « Introduction: L'utilisation diff et patch »

    Articles Liés