Utilisation des commandes diff et patch sous Linux
Cet article a pour but de vous faire comprendre comment fonctionnent les commandes diff et patch sous Linux. Ces commandes sont très utilisées dans le monde des logiciels libres, car elles permettent de patcher le code source d'un programme par exemple.
Afin de bien saisir le fonctionnement de tout ceci, nous allons commencer par créer le fichier version1 contenant les 3 lignes suivantes :
$ cat version1
1
2
4
Mais voilà, nous venons de nous rendre compte qu'il manque une ligne avec le chiffre 3. Nous allons donc créer une nouvelle version de notre fichier, nommé version2, corrigeant l'erreur :
$ cat version2
1
2
3
4
1. La commande diff
La commande diff permet de voir la différence entre deux fichiers. Voici un exemple de fonctionnement :
$ diff version1 version2
2a3
> 3
Ici, la commande nous indique qu'entre la ligne 2 et 3, il y a le chiffre 3 en plus pour le fichier version2, visible grâce au symbole >.
Si vous comparez deux fichiers contenant beaucoup de différence, on pourra utiliser la commande more en plus pour faire défiler le résultat :
diff version1 version2 | more
Cette commande permet également de connaître toutes les divergences entre les fichiers de deux répertoires. Pour cela, il suffit d'utiliser le paramètre -r :
diff -r repertoire1 repertoire1
2. Créer un patch
Imaginons maintenant que le fichier version1 a été distribué à plein de personnes et ces dernières ne veulent pas télécharger la nouvelle version. On pourra alors leurs fournir un patch (c'est à dire un fichier qui contient les différences entre deux versions). A cette fin, on utilisera la commande diff avec les paramètres suivants :
$ diff -u version1 version2 > update1to2.patch
$ cat update1to2.patch
--- version1 2007-08-04 17:15:45.000000000 +0200
+++ version2 2007-08-04 17:18:41.000000000 +0200
@@ -1,3 +1,4 @@
1
2
+3
4
Ici, on a pris le soin de rediriger les différences vers un nouveau fichier, nommé update1to2.patch. On pourra ainsi distribuer ce patch afin que la personne ayant le fichier version1, puisse le mettre à jour en version2.
3. Patcher avec la commande patch
La dernière partie de cet article, concerne l'application d'un patch. Vous aviez le fichier version1 et vous venez de recevoir le patch update1to2.patch.
Pour mette à jour votre fichier, il suffira d'utiliser la commande patch suivante :
patch -p0 < update1to2.patch
patching file version1
L'argument -p{nb} indique de tronquer x répertoires dans les noms de fichiers affectés par le patch. Cela peut-être pratique quand un patch s'applique à une aborescence qui n'est pas la même que la votre.
On vérifiera ensuite que la ligne manquante a bien été ajoutée au fichier version1.
13 Commentaires pour "Utilisation des commandes diff et patch sous Linux"
Flux des commentaires de cet article Ajouter un commentaireMerci pour ces infos précieuses
@Daria : de rien.
Voici la commande que je viens d'obtenir pour générer un patch entre deux dossiers complets:
diff -Nur dossierOrigine dossierModif > modif.patch
N : gestion des ajouts de fichiers entre l'origine et la modif
u : format de sortie ("unified")..
r : récursif
"L'argument -p0 précise que l'on veut patcher avec un niveau de 0." <= ça ne veut pas dire grand chose !
-p{nb} indique de tronquer {nb} répertoires dans les noms de fichiers affectés par le patch.
En clair ici ça ne sert strictement à rien vu que tu ne patches pas une arborescence
@Hypher : j'ai ajouté quelques précisions sur l'option -p afin que cela soit plus clair.
Quelqu'un m'a conseillé les options de diff -ruwbB --show-c-function
Il me semble qu'il faut éditer le fichier patch pour changer le nom du fichier en entrée, si nécessaire.
Penser à copier le fichier original au cas où.
cp fichier1 fichier1original
Pour finir, il faut noter que la commande renvoie le message :
patching file /chemin/fichier1
(patching file n'est pas une commande linux, mais un message renvoyé par la commande patch)
Il serait intéressant de parler du logiciel *meld* qui permet de comparer des fichiers (et même des arborescences) très simplement et de manière très efficace tout cela graphiquement, avec de nombreuses possibilités... à tester !
@yvand : Les truc graphics c'est pour les noob.
Les vrais utilisent le shell
Les vrais utilis(ai)ent le shell lorsqu'il n'y avait que ça...
je conviens que la couche graphique peut apporter sont lot d'incertitude, voire de restriction par dessus les commandes, mais cela peut être utile dans un premier temps...
meld est un bon outil.
Ceci dit, si je suis arrivé, sur ce forum, c'est bien que je cherchais les 'commandes' de base pour patcher un fichier...
@Thannoy : Merci!
Bonjour,
Mon problème c'est que j'ai un programme (pound) qui est déjà en prod qui nécessite un patch pour corriger les failles de sécurités SSL. J'ai déjà récupéré les fichiers patchs mais je ne sais pas où les appliquer car je ne trouve plus les fichiers .c ou .h comme dans les fichiers sources fraichement télécharger.
Pouvez-vous m'aider svp car cela fait des jours que je gallère là-dessus alors que c'est urgent ?
J'ai un serveur de test qui a les mêmes config mais j'ai juste besoin de savoir comment patcher une appli dans cette condition ?
Merci d'avance pour votre aide.
Merci pour l'article. Simple , clair , precis
Bonjour,
j'ai une question. Si jai la version 1 et le patch comment je fais pour récupérer la version b?