Tutoriel Subversion

Portrait de marseillais

Introduction

C'est bon, vous vous lancez avec quelques amis dans un projet de programation. Enfin, vous allez vous tapez vos quelques milliers de codes, passez vos aprem' les yeux collés sur votre écrans et vos soirées à bouffer des pizzas en débugant ce que vous avez fait dans la journée. C'est beau ! Seul problème : vous n'allez pas bosser tous ensemble sur le même PC ou sur des fichiers entièrement différents... Dans ces cas là, intégrer les modifications de chacun devient vraiment la galère et demande encore plus de travail que le « simple » debugage.
Pour régler cette difficulté, il existe un petit système « magique », Subversion, permettant de garder sur un serveur les différentes versions de votre projet. Grâce à ça, vous pourrez partagez les sources rapidement et facilement (il suffira de se connecter au serveur pour tout récupérer). Mais le principal intérêt de Subversion est de faire des mises à jour rapides et simples de vos sources en fonction des modifications faites par les autres membres de votre groupe. Voilà donc quelques bases pour son utilisation.

Créer un Repository

La première chose à faire est de créer un Repository, c'est à dire le dossier dans lequel vous stockerez les différentes versions de votre projet. Le serveur le plus connu pour le créer est SourceForge. Vous pouvez aussi voir avec le Club*Nix si il y a moyen de s'arranger.
De manière générale, pour créer un repository, la commande est :

$~ svnadmin create svn.mad/projet/repas

Il vous reste maintenant à y importer vos dossiers et fichiers :

$~ svn import bouffe svn.mad/projet/repas -m "Premier commit"
 
 
Adding    bouffe/viande/steak.c
Adding    bouffe/viande/jambon.c
Adding    bouffe/garniture/haricot.c
Adding    bouffe/garniture/frite.c
Adding    bouffe/menu.c
 
Commited revision 1

Cette commande a copié les différents fichiers contenu dans le dossier bouffe sur le serveur SVN dans le repository projet/repas en laissant comme commentaire qu'il s'agit de premier commit.
La commande import ne sert qu'à la création du repository. Nous verrons plus loin comment y rajouter d'autres fichiers.

Pour savoir ce qui se trouve dans le repository, on utilise la commande list :

$~ svn list svn.mad/projet/repas/
 
viande/
garniture/
menu.c

Enfin, pour récupérer les fichiers sur un SVN pour la toute première fois, on utilise la commande checkout :

$~ ls
projet1/ projet2/
 
$~ svn checkout svn.mad/projet/repas/
A    repas/viande/steack.c
A    repas/viande/jambon.c
A    repas/garniture/haricot.c
A    repas/garniture/frite.c
A    repas/menu.c
Checked out revision 42
 
$~ ls
projet1/ projet2/ repas/

Le checkout ne doit être fait qu'une seule fois : la première fois que vous récupérez les fichiers. Par la suite, il faut utiliser le commande update qui sera décrite un peu plus loin.

Passons aux choses sérieuses

Maintenant qu'on a vu comment se créer un repository et comment on le remplit pour la première fois. Maintenant, vous avez bosser sur votre projet, vous y avez ajouté ou supprimé des fichiers, vous y avez apporté des modifications... Mais tout ça seulement de votre côté et vous voulez bien que tout votre groupe puisse en profiter et vous aimeriez profiter des changements qu'ils ont fait.

Etat du repository et de votre copie

Pour connaître l'état du repository comparé à l'état de votre copie de travail vous avez les commandes status et diff, la première indiquant quel est le statut de chaque document de votre copie par rapport au repository et la seconde indique quelles sont les différences entre les documents de votre copie et le reste. Ainsi, en utilisant status :

$~ svn status
 
A    viande/gigot.c
D    viande/saucisse.c
C    garniture/frite.c
M    garniture/haricot.c

Petite explication des items précédents les noms de fichiers :

  • A signifie que le fichier sera ajouté au repository à votre prochain commit
  • D signifie que votre prochain commit supprimera le fichier
  • C signifie qu'il y a un conflit entre l'état de votre copie du fichier et son état dans le repository
  • M signifie que vous avez fait des changements dans le fichier
  • Le conflit signifie que vous avez fait des modifications sur le fichier mais que entre temps, avant que vous l'ayez transmis au serveur SVN, quelqu'un a modifié le même fichier et que ces changements sont en conflits avec ce que vous avez fait.

    Le diff permet de repérer les différences entre la dernière version du repository et votre copie :

    $~ svn diff
     
    Index: menu.c
    =========================
    --- menu.c (revision 21)
    +++ menu.c (working copy)
    @@ -5,15 +5,17 @@
    int main(void){
    -    addHaricot(5);
    +    addFrite(5);
    +    addSteack(5);
        return 0;
    }

    Ici, on voit que le code de la fonction main dans le fichier menu.c a été modifié : on lui a retiré 5 portions de haricot pour lui rajouter 5 portions de frite et 5 steacks. Grace à diff vous pouvez ainsi facilement créer des patchs :

    $~ svn diff > patch

    Se mettre à jour

    Mettre à jour sa copie de travail se fait en une seule commande, update, qui synchronise votre copie avec la dernière version disponible sur le svn :

    $~ svn update
     
    U    menu.c
    U    garniture/frite.c
    Updated to revision 43.

    Modifier la copie locale

    Bon je vais pas vous apprendre à modifier un fichier : vous tapez, vous enregistrez et c'est fini. Les problèmes arrivent quand vous voulez ajouter, supprimer ou déplacer un fichier ou un dossier. Il faut en effet tenir au courant le SVN que vous allez effectuer ce genre de modif'. Pour cela, on utilise les commandes add, delete, mkdir, copy et move.

  • $~ svn add garniture/pates.c va ajouter le fichier au prochain commit
  • $~ svn delete viande/saucisse.c supprimera le fichier au prochain commit
  • $~ svn mkdir dessert créera le dossier dessert au prochain commit
  • Les commandes copy et move ont des noms assez descriptifs et font la même chose que les commandes bash du même nom ;)

    Faire le commit (enfin...!)

    Avant de faire un commit, SVN vérifiera en premier qu'il n'y a pas de conflits entre votre copie et la dernière version présente sur le SVN. Si il y en a vous avez deux possibilités : soit vous annulez tous les changements que vous avez fait dans les fichiers en conflit, soit vous changez les fichiers juste au endroits genants. L'annulation pure et simple des modifications que vous avez faites passe par $~ svn revert file.c

    Une fois que vous avez réglé tous les conflits, il faut le signaler au SVN par $~ svn resolved file.

    Vous pouvez maintenant atteindre le Sacré Graal : transférer vos modifications sur le SVN :

    $~ svn commit -m "Nouveau commit"

    L'option -m permet d'associer un commit au message afin de décrire vite fait vos changements aux autres membres de votre équipe.

    Conclusion

    Vous avez maintenant des bases concernant l'utilisation de SVN. J'ai précisé les différentes actions de base qu'il est possible d'invoquer à partir d'une ligne de commande pour que vous sachiez un peu ce qui se passe. Maintenant, il existe de nombreux clients Subversion (tant sous Windows que sous Linux) comme SmartSVN pour n'en citer qu'un.
    Rappelez-vous : vous êtes nombreux à travailler sur un projet logiciel ? Utilisez SVN pour ne plus perdre du temps à vous transférer les fichiers via une clé USB puis à repérer les différences entre tous les fichiers...

    (Tuto réalisé par MAD[dollm@esiee.fr])