Subversion, le logiciel de gestion de version, permet facilement de regarder les différences entre un fichier dans la working copy, c’est à dire en local et potentiellement modifiée par nos soins et son homologue dans le repository, c’est à dire sur le serveur et potentiellement modifié par une autre personne.
La commande suivante permet d’afficher les différences entre le fichier local monfichier.php et la révision en cours dans le repository de ce même fichier:
svn diff monfichier.php
Bien entendu, pour un petit fichier ou lorsqu’il y a peu de différence, le résultat est tout a fait lisible. Quelques lignes avec des « + » ou des « - » et on comprends bien ce qu’il y a de différent. En revanche, on ne sait pas trop le contexte de la modification et, surtout, lorsqu’il s’agit de gros fichiers ou lorsqu’il y a plusieurs différences, ça devient tout bonnement imbitable.
Heureusement, il est possible d’utiliser un programme tiers pour faire ce travail. Et vimdiff le fait très bien. Malheureusement svn diff envoi les paramètres dans un ordre que vimdiff ne comprends pas. Aussi, il nous faut passer par un petit script qui remet tout ça en ordre.
- Dans un fichier, où vous voulez, par exemple dans votre home si c’est uniquement pour vous, ou dans /usr/local/bin si c’est pour plusieurs personnes (dans le cadre d’un serveur de développement, par exemple), créez un fichier diffwithvim:
#!/usr/bin/python import sys, os diffprogram = '/usr/bin/vimdiff' fn_old = sys.argv[6] fn_working_copy = sys.argv[7] # arrange the args in the order diffprogram expects them args = ['diffwithvim', '-d', fn_old, fn_working_copy] os.execv(diffprogram, args)
- Editez ~/.subversion/config
- Trouvez [helpers]
- Ajoutez la ligne suivante:
diff-cmd = /usr/local/bin/diffwithvim
Maintenant, lorsque vous ferez un svn diff monfichier.php, vimdiff (qui n’est rien d’autre que vim) se lancera, coupé en 2 verticalement, vous pourrez voir les 2 versions de fichiers côte à côte et comprendre plus facilement les différences grâce aux couleurs de vimdiff.
Petite astuce: Pour quitter vimdiff, vous pouvez faire :q pour chacune des 2 versions de fichier ou bien :qa pour quitter les 2 en même temps.






22 août 2007 21h38
Merci pour cette astuce !
NB: ce n’est pas important, mais bon, je le précise quand même ^_^ tu as oublié d’ajouter un retour à la ligne entre python et import.
23 août 2007 18h35
En effet, petit bug :)
corrigé :)
18 septembre 2007 14h29
Il fallait bien sûr lire « svn diff monfichier.php » et non « svn siff monfichier.php »
Merci pour cette très utile astuce!
6 novembre 2007 00h02
Tiens pas bête. Merci bien. ^^
20 décembre 2007 15h51
pourquoi faire simple quand on peut faire compliquer ?
– pour le point 1 : un simple script du genre
$ cat ~/scripts/svnvimdiff
#!/bin/bash
vim -d « $6″ « $7″
– ensuite sans toucher au fichier config de svn on peut appeler le script en faisant svn diff –diff-cmd ~/scripts/svnvimdiff. Personnellement je prefere mettre un colordiff -pruN dans le fichier config de svn.
Enfin merci beaucoup pour l’astuce quand même (les paramètre à envoyer à vim…) , pour la suite une fois dans vim taper « :help diff » et faites vous des raccourcis pour diffput et diffget …
2 janvier 2008 16h29
La version de jbar ne fonctionne pas du tout chez moi.
4 janvier 2008 17h46
c’est le ~ qui ne marche pas à l’interieur de la commande svn : il vaut mieux le remplacer par $HOME :
$ svn diff –diff-cmd « $HOME/scripts/svnvimdiff » monfichier
(remarque le $HOME ne devrait aussi lui même pas marcher à l’intérieur du fichier de conf de subversion (à tester) : il vaudrait mieux le remplacer par un chemin complet si le script n’est pas dans le PATH ).
ensuite dans le « script » pour faire plus joli un tout petit peu plus propre ou peut aussi faire tel quel :
#!/bin/bash
exec vim -d “$6″ “$7″
4 janvier 2008 21h06
J’ai mis le path en entier et ca ne marchait pas non plus.
8 janvier 2008 17h37
T’as pas oublié de faire un petit chmod +x sur le script ?
Sinon je ne vois plus ce qui pourrait clocher… ( t’es pas sous windows quand même :-p ).
En tout cas ca marche très bien pour moi.
Ci-joint un extrait de mon fichier vimrc :
syntax enable
« les tabulations comme je les aime : equivalentes à 4 espaces
set shiftwidth=4
set softtabstop=4
« ne pas utiliser le caractere special tab
set expandtab
« pour naviguer d’un buffer à l’autre
nmap :w:bp
nmap :w:bn
nmap :bp!
nmap :bn!
« pour vimdiff
map :diffget
map :diffput
8 janvier 2008 17h38
et zut j’ai oublié de proteger les \….
8 janvier 2008 17h40
je vais y arriver … \\< ‘<’ < >
8 janvier 2008 17h45
Donc mon extrait de fichier vimrc ( :| sed ‘ s/</\</g ; s/>/\>/g ‘
syntax enable
« les tabulations comme je les aime : equivalentes à 4 espaces
set shiftwidth=4
set softtabstop=4
« ne pas utiliser le caractere special tab
set expandtab
« pour naviguer dun buffer à lautre
nmap <M-PageUp> :w<CR>:bp<CR>
nmap <M-PageDown> :w<CR>:bn<CR>
nmap <C-PageUp> :bp!<CR>
nmap <C-PageDown> :bn!<CR>
« pour vimdiff
map <A-Left> :diffget<CR>
map <A-Right> :diffput<CR>
9 janvier 2008 12h21
Bon, finalement ca fonctionne… si ca se trouve, j’avais effectivement oublié de le mettre en exécutable…
En revanche, j’ai du supprimer les guillemets autour de $6 et $7 et ca marche avec et sans exec
du coup, ca donne:
#!/bin/bash
vim -d $6 $7
pour ce qui est du mappage, je n’y arrive pas… mais je me demande si ca vient pas de putty, j’ai déjà des soucis avec le pavé numérique sur putty… ca m’étonnerait pas que les fleches posent soucis aussi.
Merci beaucoup :)
Je modifierais le billet plus tard.