diff et patch en dix minutes
Le guide de dix minutes sur diff et patch
Situation 1 : Vous êtes en train de compiler un paquet depuis les sources et vous remarquez que quelqu’un a déjà effectué le travail pour vous en modifiant les sources pour que l’application compile sur votre système. Le travail réalisé est disponible sous forme de patch, mais vous ne savez pas vraiment bien comment vous en servir. La réponse est d’appliquer le patch contre la version originale du code source avec un utilitaire de commande appelé, de façon appropriée, patch.
Situation 2 : Vous avez téléchargé le code source d’un logiciel opensource et après près d’une heure d’édition et modifications mineures vous parvenez à le compiler sur votre système. Vous souhaitez donc mettre votre travail à disposition pour d’autres programmeurs, ou pour les auteurs même du logiciel, sans avoir à redistribuer le logiciel modifié complet. Vous êtes donc dans la situation où c’est à vous de créer ce patch, et l’outil nécessaire à cela, se nomme diff
Voici un guide rapide sur diff et patch qui vous aidera dans ces situations en décrivant les outils de la façon la plus communément utilisée. Il vous en dira suffisamment pour commencer de la bonne façon. Plus tard, vous pourrez apprendre les tenants et les aboutissants de diff et patch à votre guise, en utilisant les pages de manuel.
Appliquer des patchs avec patch
Pour appliquer un patch à un seul fichier, mettez vous dans le dossier où se trouve le fichier à modifier, le patch et appelez patch :
patch < foo.patch
Ces instructions assument que le patch est distribué dans un format unifié, qui identifie le fichier sur lequel appliquer le patch. Sinon, vous pouvez le préciser avec la commande :
patch foo.txt < bar.patch
Appliquer des patches à un dossier complet (sûrement le cas le plus commun) est similaire, mais vous devez faire attention en identifiant le “niveau p”. Cela signifie que, dans les fichiers de patch, les fichiers à patcher sont identifiés par des noms de chemins qui peuvent être différents maintenant que les fichiers se trouvent sur votre ordinateur plutôt que sur l’ordinateur où le patch a été créé. Le niveau de profondeur p est fait pour ignorer les parties du nom de chemin afin qu’il puisse identifier les fichiers correctement. Le plus souvent un niveau de 1 fonctionnera, vous utiliserez donc :
patch -p1 < bar.patch
Vous devriez changer le répertoire source de haut niveau avant d’exécuter cette commande. Si un niveau p n’identifie pas correctement les fichiers à patcher, inspecter le patch pour repérer les noms complets d’accès aux fichiers. Si vous voyez un nom comme :
/users/stephen/package/src/net/http.c
Et que vous souhaitez modifier le fichier net/http.c, utilisez :
patch -p5 < baz.patch
En général, compter jusqu’à un pour chaque séparateur de chemin (barre oblique) que vous supprimez à partir du début du chemin, jusqu’à ce que ce que le chemin qui reste existe dans votre répertoire de travail. Le nombre atteint est le niveau p.
Pour effacer les effets d’un patch, utilisez l’option -R, comme ceci :
patch -p5 -R < baz.patch
Créer des patchs avec diff
L’utilisation de diff est simple si vous travaillez avec des fichiers ou des répertoires individuels entiers. Pour créer un patch pour un seul fichier que vous avez copié, renommé puis modifé, utilisez la commande :
diff -u original.c new.c > original.patch
Pour créer un patch pour une arborescence complète des sources, faire une copie de l’arbre :
cp -R original new
Apportez les modifications nécessaires dans le répertoire copié. Ensuite, créez un patch avec la commande suivante :
diff -rupN original/ new/ > original.patch
C’est tout ce dont vous avez besoin pour commencez à travailler avec diff et patch. Pour de plus amples informations, utilisez les pages de manuel :
man diff man patch
Traductions
Cet article a été traduit et republié dans les langues suivantes :
Espagnole : Guia de 10 minutos de diff y patch
Portugaise : O Guia de Dez Minutos de diff e patch
Anglaise : The Ten Minute Guide to diff and patch
Publié le 15 février 2012, dans code, planet-libre, tips et tagué diff, patch. Ajouter aux Favoris le permalien. 4 Commentaires.

Moi dans la plupart des cas, les patchs ne contiennent que les chemins à l’intérieur du projet, donc en se positionnant au plus haut du projet, “-p0″ suffit.
J’ajoute qu’il peut être intéressant d’utiliser l’option “–dry-run” avant d’effectuer un patch. Il indique ce qui va être réalisé. Ça permet justement de vérifier la profondeur de « p » mais aussi de voir si le patch est applicable.
Il se peut que vous ayez aussi des des conflits ou des bouts de patch rejetés (car le patch a été fait sur une version différente de la version de votre projet). Dans ce cas, des fichier « .rej » et « .orig » seront créés. Ils vous permettront de comprendre ce qui n’est pas passé et d’appliquer (ou pas) les changements à la main. Vous pouvez également passer l’option “–merge” à patch qui inhibe la création de ces fichiers et indique les rejets directement dans le fichier source à l’aide des marqueurs “<<<<>>>>”. Si vous êtes familier avec ce format, ça peut être une option intéressante.
L’option “-l” de patch permet de ne pas tenir compte des changements d’espaces, tabulations entre la source et le patch. Peut être pratique si vous avez des modifications en ce sens, afin d’éviter que le patch ne soit rejeté.
De même, l’option “-w” de diff permet de ne pas tenir comptes des espacements dans la constitution du fichier patch.
J’ajoute qu’il existe des commandes pour les VCS ou DVCS qui permettent de créer facilement ces patchs en faisant une différente entre le contenu sur votre poste, et le contenu de référence du (D)VCS. Ces commandes contiennent en général le mot “diff” et produisent en général un “diff unifié” de la même manière que la commande “diff -u”.
Pour CVS : cvs diff -u
Pour SVN : svn diff
Pour GIT : git diff
Merci pour cet article !
Merci pour ce complément d’informations
Merci pour cette piqûre de rappel. Je bookmark&&tweet…
Ping : Fabio Brandão – Blog » Blog Archive » O Guia de Dez Minutos de diff e patch