Subversion

De Ensiwiki
Aller à : navigation, rechercher
Subversion logo.png Subversion
Développeur [CollabNet, Inc]

Dernière version 1.5.1

Environnement Windows,MacOS,Linux

Type Gestionnaire de version
Licence Apache/BSD

Site Web subversion.tigris.org

Windows.png  Windows Apple.png  MacOS X Tux.png  Linux 

Présentation

Subversion (SVN pour les intimes) est un logiciel de gestion de versions. Entendez par là qu'il gère les différentes versions, appelées révisions, de vos travaux en permettant un travail collaboratif simple. L'application la plus courante qu'on lui trouve est bien sûr le cadre du développement en informatique.

Pour un codeur solitaire, l'intérêt est principalement la simple sauvegarde de données et le fait de pouvoir revenir en arrière, SVN prend tout son sens lorsque le développement se fait en équipe !

SVN doit sa popularité à sa simplicité, et à sa ressemblance avec son ancêtre CVS. D'autres gestionnaires de versions plus puissants existent comme Git (utilisé en Projet GL à l'Ensimag) ou Mercurial.

Actions de base

  • Lors de l'Import initial, SVN initialise le projet et crée son arborescence propre dans le répertoire précisé qu'on appelle repository.
  • Le Checkout importe les données présentes dans le repository voulu.
  • Le Commit envoie les modifications que vous avez apportées, en créant une nouvelle révision.
  • L'Update met à jour votre version à la dernière révision qui a été commit

Installer Subversion

Tout d'abord, récupérez la dernière version sur le site officiel : http://subversion.tigris.org/.

Les puristes pourront aussi partir du code source !

Notez également que si la ligne de commande vous rebute dès à présent, il existe des logiciels Clients un peu plus User Friendly qui s'intègrent (ou pas) au choix dans votre IDE préféré ou directement dans votre environnement ! Certains ne nécessitent pas d'installer Subversion. La suite de l'article prend les exemples en ligne de commandes.

Premiers pas

Utilisation

Checkout

Autant y aller par l'exemple. Commençons par récupérer la dernière révision par un Checkout.

ensisun:~>svn checkout http://igate.imag.fr/secure/svn/bde
...
A    bde/trunk/cercle/img/index.html
A    bde/trunk/cercle/img/icone_date.png
A    bde/trunk/cercle/js
A    bde/trunk/cercle/js/index.html
A    bde/trunk/cercle/js/tools.js
A    bde/trunk/cercle/top_bar.php
A    bde/trunk/cercle/index.php
A    bde/trunk/index.php
Checked out revision 94.
ensisun:~>

SVN transfère tous les fichiers de la dernière révision actuelle dans le dossier courant. Notez que chaque dossier contient un dossier .svn qui contient toutes les informations nécessaires à la gestion de version. Mieux vaut ne pas y toucher sans savoir ce que vous faites pour ne pas pourrir votre version.

Raccourci :

ensisun:~>svn co http://igate.imag.fr/secure/svn/bde


Commit

Disons que vous avez modifié le fichier index.php. Pour envoyer votre version, faites un commit

ensisun:~>svn commit
Sending        bde/trunk/index.php
Transmitting file data .
Committed revision 95.

Après la première ligne vous aurez certainement à rentrer le message de commit, pour préciser les changements apportés. Pour cela il faut toucher un peu au .bash_login ou au .bashrc au choix dans votre répertoire $HOME

ensisun:~>cd
ensisun:~>echo"export SVN_EDITOR=pico" >> .bash_login # Ajoute pico en tant qu'editeur SVN
ensisun:~>source .bash_login # pour recharger (sourcer) le fichier

Bien sûr, remplacez pico par votre éditeur préféré, Vi, Vim, Nedit ou encore Emacs...

Raccourci pour le commit :

ensisun:~>svn ci -m "Message de commmit"

Petite précision : avant de commit votre travail, SVN s'assurera que vous disposez de la dernière version disponible sur le repository, pour minimiser les conflits entre les committers. Il est conseillé de toujours effectuer un Update avant un Commit :

Update

Mettez à jour votre version de travail avec la commande suivante :

telesun:~>svn update
U    bde/trunk/index.php
Updated to revision 95.

#Raccourci
ensisun:~>svn up 

Lors de l'update, SVN récupère les fichiers qui ont été modifié par rapport à votre version pour vous mettre à jour. Si vous avez modifié également un de ces fichiers, il tente de fusionner les modifications (opération Merge) avec une relative efficacité.

Cependant, s'il n'arrive pas à faire cette fusion, le fichier concerné est alors en conflit (Conflicted). Cela arrive notamment si vous éditez à plusieurs la même portion d'un fichier, et même parfois pour des raisons plus obscures...

Conflits

Si vous êtes dans le cas décrit juste avant, vous pouvez vérifier avec

ensisun:~>svn status 
C    index.php

Le fichier index.php est marqué Conflicted. Il faut résoudre le conflit du fichier. La solution dépend de la situation. Si vos modifications étaient peu pertinentes, il suffira de forcer SVN à remplacer votre version par celle de la dernière révision. C'est le revert.

ensisun:~>svn revert index.php
Reverted 'index.php'

Si vous ouvrez le fichier en conflit avec un éditeur, certaines parties vont ressembler à ça :

<<<<<<< .mine
   Partie qui correspond à votre version
=======
   Partie qui correspond à la révision actuelle
>>>>>>> .r95

Editez alors au mieux pour rendre le tout cohérent, puis indiquez que le fichier n'est plus en conflit :

ensisun:~>svn resolved index.php

Si vous avez conservé des modifications par rapport à la version du SVN, svn status donnera alors

ensisun:~>svn status
M    index.php

Faites alors un nouveau commit pour envoyer vos modifications.

Si les modifications sont à prendre en compte des deux côtés, il faut alors s'armer de patience et faire la fusion plus ou moins à la main.

Ajouter / Supprimer des fichiers

SVN n'est pas "tout puissant" : si lors de l'évolution du projet, celui-ci comprend de nouveaux fichiers, il faut préciser à SVN qu'il peut (et qu'il doit) placer son autorité dessus :

 $ svn add fich.c
  A     fich.c

De la même manière, toutes les manipulations qui modifient le chemin des fichiers doivent passer par svn, pour qu'il puisse s'y retrouver. Au lieu de "rm", on fait "svn delete", au lieu de mv on a "svn mv", et au lieu de cp on a "svn cp".

Remarque pour utilisateur avancésvn cp A B et cp A B; svn add B ne sont pas identiques ; dans le premier cas on copie également l'historique du fichier. Cela veut aussi dire que le fichier n'est pas renvoyé au serveur, mais uniquement un "pointeur" vers le fichier ancêtre. C'est très pratique pour faire des branches et des tags en temps constant !


Diff

svn diff permet de lister les différences entre la copie locale et le dépôt. Grosso modo, c'est le travail fait, qui sera envoyé au serveur. Le format employé est celui de diff -u : une ligne commençant par un + est un ajout, et par un -, une suppression.

Rendre le TP : export

C'est bien beau de travailler, mais à un moment c'est l'heure de TEIDE ! Bien sûr, on peut faire un tarball de sa copie locale, mais on rendrait par la même occasion les .svn qui trainent dans les répertoires.

Pour faire une copie sans inclure les informations spéciales (.svn), il suffit de faire svn export :

tp_ada_1 $ svn export . rendu
Export complete.
tp_ada_1 $ tar czf rendu.tar.gz rendu/
tp_ada_1 $ rm -rf rendu/

Un fichier rendu.tar.gz est créé, on peut le déposer sur TEIDE.

Qui a tout cassé ? blame

Quand une fonction pose problème et qu'on aimerait discuter avec son "propriétaire" (celui qui l'a écrite), c'est fastidieux de relire tous les logs pour voir l'histoire du fichier. Svn propose la commande "blame" : svn blame fichier affiche le fichier, en faisant précéder chaque ligne du numéro de révision où cette ligne a été modifiée pour la dernière fois, ainsi que l'auteur de cette révision.

Créer son propre SVN

Chez soi ou sur les machines de l'Ensimag

Sur le web

  • Assembla : un fournisseur de service SVN gratuit.

Clients

  • RapidSVN : interface graphique pour svn multi plates-formes.
  • TortoiseSvn : intégration de svn dans l'explorateur Windows.
  • psvn : svn dans Emacs.