Subversion

Un article de Agora2ia.


subversion_logo_hor-468x64.png

Sommaire

Présentation

Overview


Cet outil en développement depuis 2002 propose un grand nombre de fonctionnalités et d'innovations par rapport à son aîné vieillissant qu'est CVS. Pour CVS, il est temps de passer la main comme a pu le faire RCS en son temps.


Parfois appelé SVN.


En plus des fonctionalités supportées par CVS, Subversion assure :

  • la gestion des répertoires,
  • le versioning des commit, et non des fichiers : les fichiers ont donc rarement des numéros de version non consécutifs. Par contre il est facile de retrouver l'ensemble des fichiers modifiés et remontés lors d'un même commit : ils ont tous le même numéro de version.


Les serveurs

Subversion offre différentes façons d'accéder à un repository, chacune avec des fonctions plus ou moins évoluées. Ces possibilités ne sont exclusives et il n'y en pas une meilleure que l'autre : chacune répond à des besoins spécifiques.

  • La plus simple à installer, et la moins évoluée, est l'accès direct au repository, ce qui implique d'être sur la même machine, ou via un lecteur monté (en file:///).
  • Pour offrie une plus grande accessibilité au repository, au moyen d'une installation simple, on peut utiliser le serveur fournit avec la distribution Subversion. On pourra ainsi simplement et rapidement mettre le repository à disposition d'une équipe (de développement) ou sur un réseau d'entreprise. Cependant cette option souffre d'une gestion des droits élémentaire.
  • Si l'on souhaite en plus une gestion différentielle des droits d'accès selon les utilisateurs et les projets, une authentification, voire du cryptage, il faudra alors utiliser le serveur Apache.


Accéder au référentiel

Il est possible d'accéder à un référentiel Subversion (via le serveur Apache) avec différents moyens, chacun offrant des fonctionalités plus ou moins évoluées, certaines faisant la force de Subversion.

  1. Avec un client Web : avec un navigateur il est possible d'accéder en lecture seule au référentiel depuis n'importe quel endroit qui a accès au serveur via une connexion http. Par contre, seules la dernière version de chaque fichier est accessible.
  2. Avec un client WebDav : l'explorateur de fichier des dernières version de Windows, par exemple, supporte cette extension de du protocole http. On peut cette fois accéder en écriture au référentiel, mais toujours sur la dernière version des fichiers.
  3. Avec un client Subversion, tel que TortoiseSvn. Ce type d'outils permet tirer partie de l'ensemble des fonctionalités de Subversion, et donc d'assurer pleinement la gestion de versions.
     Lecture Ecriture Historique Admin  ||  CVS VSS SVN 
http    +                               ||               
WebDav  +       +                       ||               
SVN     +       +          +       +    ||   +   +   +


Les properties

En plus de la gestion de version de fichiers et de répertoires, Subversion permet d'associer des méta-données sur ces fichiers et répertoires : c'est la notion de property. Cette fonctionnalité peut être vue comme une association clef/valeur que l'on peut poser sur un fichier/répertoire donné, et qui persistera de la révision courante du fichier/répertoire, jusqu'à ce qu'elle soit éventuellement supprimée. Cette fonctionnalité est utilisée pour des fonctions propres de Subversion comme le ignore-file ou les keywords, mais peut également servir à supporter la valeur d'un copyright par exemple...

svn propset copyright '(c) 2003 Red-Bean Software' calc/button.c


Outils

Serveurs hostés

Le plus simple est encore d'utiliser un serveur SVN hébergé ;o)...

Vous trouverez une liste de gestionnaires de version hébergés (et pas seulement Subversion) sur ce lien Hosted source control.


Client desktop


Plugins Eclipse

Il existe plusieurs plugins Subversion pour l'IDE Eclipse:


Clients Web


Tips

Ignorer des fichiers et cvsignore

> svn propset svn:ignore -F .cvsignore .


Bug : Chunk delimiter was invalid

Lorsque je cherche à faire un checkout via http à partir d'un repository Subversion que j'administre avec un serveur Apache 2 (2.0.54), j'obtiens un message d'erreur dés que le repository augmente un peu en volume.


Problèmes identiques sur le net :


La correction suivante supposer que l'on utilise Apache comme serveur : il faut recompiler Apache et Subversion en positionnant la variable d'environnement ac_cv_func_poll à no.


Les sources des versions 2.0.54 d'Apache et 1.2.3 de Subversion contiennent un workspace Microsoft (.dsw) et les fichiers projet (.dsp) : on peut ainsi facilement compiler les 2 outils via Microsoft VisualStudio 6.0.


Configuration avec Berlios

  1. Télécharger TortoiseSVN et l'installer.
  2. Séléctionner le répertoire de travail et clic-droit > SVN Checkout
    1. Entrez l'url du repository, par exemple svn://svn.berlios.de/myproject
    2. Puis OK.


Utilisation des keywords

Certaines informations, comme la dernière date de modification d'un fichier, sont à la fois pénibles à maintenir pour une personne, et tellement simple à modifier pour le GestionnaireDeVersion. C'est pour cela qu'il est possible d'utiliser dans certains gestionnaires des keywords, qui seront remplacés par le gestionnaire lui même au moment du commit. Cette propriété dans Subversion repose sur sa notion de property.


La liste des mots clefs supportés par Subversion est la suivante :

  • LastChangedDate ou Date : sera remplacé par exemple par $LastChangedDate: 2002-07-22 21:42:37 -0700 (Mon, 22 Jul 2002) $.
  • LastChangedRevision ou Revision ou Rev : sera remplacé par exemple par $LastChangedRevision: 144 $.
  • LastChangedBy ou Author : sera remplacé par exemple par $LastChangedBy: harry $.
  • HeadURL ou URL. : sera remplacé par exemple par $HeadURL: http://svn.collab.net/repos/trunk/README $.
  • Id : sera remplacer par exemple par : sera remplacé par exemple par <tt>$HeadURL: http://svn.collab.net/repos/trunk/README $.


Pour mettre en place l'utilisation de ces keywords, il y a deux étapes :

  1. Activer le(s) keyword(s) sur le(s) fichier(s) : svn propset svn:keywords "LastChangedDate Author" path\to\file.txt (pour activer les mots clef LastChangedDate et Author sur le fichier file.txt).
  2. Placer le(s) $Keyword$ dans le(s) fichier(s) source.

Dans notre exemple, si l'on place le keyword Revision dans le fichier file.txt, il ne sera pas pris en compte, bien que ça soit un mot clef Subversion.


Importer un répertoire d'un référentiel vers un autre

Exemple : On souhaite copier uniquement le projet dvdzone du référentiel C:\repository\svn\forge (et filtrer les autres projets) vers le nouveau référentiel C:\repository\svn\gallery.

>svnadmin dump C:\repository\svn\forge > forge.mem
>type forge.mem | svndumpfilter include dvdzone > forge-dvdzone.mem
>svnadmin create C:\repository\svn\gallery
>svnadmin load C:\repository\svn\gallery < forge-dvdzone.mem


Configurer un proxy

Afin de faire fonctionner SVN, en ligne de commande par exemple, derrière un proxy, on peut modifier son fichier de configuration :


Taggé une version / poser un label

Il est important de figer l'état de votre référentiel lors d'événements importants, comme une nouvelle livraison ou un vaste remaniement.

On parle souvent de "pose d'un tag" (ou d'étiquette) ou de labellisation.

Dans Subversion, cette manipulation est superflue étant donné que chaque commit porte un numéro de version atomique et incrémental : ce numéro de version peut donc jouer le rôle de tag… Il est simplement moins parlant.

En respectant le layout de repository (l'arborescence), la pose d'un label consiste en une "copie" de la version actuelle du trunck vers le répertoire tags. Il s'agit d'une copie optimisée ("virtuelle") qui n'aura pas pour effet de doubler la taille de votre repository !

Ainsi, pour labelliser la version courant de monprojet en une version monprojet-2.7, on utilise la commande suivante :

   svn copy http://www.masociete.com/svn/monprojet/trunk http://www.masociete.com/svn/monprojet/tags/monprojet-2.7 -m "Livraison de la version 2.7 (correction du bug 456)."
 

Ressources :

Installation d'un serveur sur Mac (OS X)


Général

Une possibilité est de créer un compte admin dans Mac OS X qui ait en charge les actions relatives à l'administration Subversion (Création de référentiel...).

Je viens de lire cette possibilité : a voir à l'usage si cela est pertinent...

$ cd /data/repository/svn/
$ svnadmin create sandbox
$ sudo chmod -R 777 sandbox


Subversion pour Mac


SvnServe


Apache


Clients Subversion pour Mac

Voir chapitre sur les clients subversion plus bas...


Installation d'un serveur avec Apache

Installation de Subversion

  • Réalisé avec la version Subversion-1.3.0


Installation du serveur Apache httpd


Configuration du serveur Apache httpd

Copier les fichiers :

  • mod_dav_svn.so,
  • mod_authz_svn.so,
  • libdb43.dll et
  • intl3_svn.dll (Ces 2 dernières DLL sont pour contourner un pb lié à une différence de version dans les DLL utilisées entra Apache-2.0.55 et Subversion-1.3.0.

depuis le répertoire SUBVERSION_HOME/bin (ou SUBVERSION_HOME/httpd) de Subversion vers le répertoire APACHE_HOME/modules d'Apache. Il s'agit du plugin permettant d'ajouter le support SubVersion aux fonctions DAV natives d'Apache.

Si vous avez des erreur Apache en essayant de vous connecter au serveur, vous pouvez copier les fichiers :

  • libapriconv.dll
  • libaprutil.dll
  • libapr.dll

depuis le répertoire SUBVERSION_HOME/bin vers C:\WINDOWS ou C:\WINDOWS\system32.

Il faut ensuite compléter le fichier <APACHE_HOME>/conf/httpd.conf :

LoadModule dav_module modules/mod_dav.so
LoadModule dav_svn_module modules/mod_dav_svn.so

...

<Location /svn>
   DAV svn
   # SVNParentPath c:/dev/repository/svn
   SVNPath c:/dev/repository/svn/incubator
   
   AuthzSVNAccessFile "c:/dev/repository/svn/incubator-access.txt"
   
   Require valid-user
   AuthType Basic
   AuthName "Référentiel Subversion de l'Incubateur."
   AuthUserFile "c:/dev/repository/svn/passwords.txt"
   
   SVNAutoversioning on

   # Feuille de style pour la consultation du repository via internet
   # SVNIndexXSLT "/svn-tools/svnindex.xsl"
</Location>


Ou si vous souhaitez créer un référentiel "publique", sans accès sécurisé :

<Location /svn/public>
   DAV svn
   SVNPath c:/dev/repository/svn/public
   SVNAutoversioning on
   SVNIndexXSLT "/svn-tools/svnindex.xsl"
</Location>


Mettre en place les accès limités

Il faut positionner les deux fichiers configurés ci-dessus :

  1. Un qui contient la liste des pairs login/password,
  2. Un qui contient la liste des logins autorisés pour le(s) référentiel(s) Subversion, et les droits assocés à chaque login.


Pour le fichier des login/password, cf. Apache et le cryptage des mots de passe...


Pour le fichier de la liste des comptes autorisés, par exemple, pour donner un accès en lecture/écriture au compte incubator, et en lecture seule à tout le monde (incubator-access.txt) :

[/]
incubator = rw
* = r


Un exemple plus évolué avec un groupe d'utilisateur (sachant que les mots de passe sont définis par utilisateur, et non par groupe) :

[groups]
dev-team = couvreu, bobo, john, do

[/]
@dev-team = rw
incubator = rw
guest = r
* = r


Configurer la feuille de style XSL

  1. Télécharger les fichiers svnindex.xsl et svnindex.css, et les mettre dans le répertoire c:/dev/repository/svn/tools.
  2. Décommenter la ligne SVNIndexXSLT "/svn-tools/svnindex.xsl" dans le fichier de configuration httpd.conf (cf. ci dessus).
  3. Ajouter la portion suivante :
Alias /svn-tools "c:/dev/repository/svn/tools"
<Directory "c:/dev/repository/svn/tools">
   Options Indexes MultiViews
   AllowOverride None
   Order allow,deny
   Allow from all
</Directory>


Pour plus d'info : Subversion XSLT


Créer un référentiel

>svnadmin create d:/chemin/vers/referentiel


Mettre en place le layout Subversion

Afin de prendre en compte correctement la gestion des "release" via les "tags", il est recommandé d'utilisation le layout recommandé par Subversion, à savoir :


Pour cela, il faut créer les trois répertoires indiqués via la séquence de commandes suivante :

>svn mkdir trunk
>svn mkdir branches
>svn mkdir tags

Cette première séquence implique d'avoir préalablement fait un checkout, puis de faire un commit final pour remonter la création des 3 répertoires sur le référentiel central.

Pour éviter cela, on peut utiliser la séquence suivante, en gardant à l'ésprit que chaque ligne prend immediatement effet sur le référentiel (à éviter donc quand on n'est pas à l'aise) :

>svn mkdir http://localhost/svnrepo/trunk -m "Creation de la structure"
 >svn mkdir http://localhost/svnrepo/branches -m "Creation de la structure"
 >svn mkdir http://localhost/svnrepo/tags -m "Creation de la structure" 

Importer un projet dans le référentiel

En passant par le chemin local :

>svn import /
    d:/rep_contenant_projet /
    file:///d:/chemin/vers/referentiel/nom_du_projet / 
    --message "Structure initiale"


Ou via l'URL du référentiel SVN :

>svn import /
    d:/rep_contenant_projet /
    http://localhost:88/svn/incubator/trunk/ / 
    --message "Structure initiale"


Clients Subversion

Comparatifs

Pour Windows


Pour Mac OS X

Ressources


EN VRAC


Création d'un projet sur le référentiel Subversion :

set REPO=http://a7wj111:8080/svn/incubator/agf-sma-archetype
svn mkdir %REPO% %REPO%/trunk %REPO%/tags %REPO%/branches -m "Creation du layout Subversion pour le projet agf-sma-archetype"


Création de l'arborescence projet sur le référentiel Subversion :

{{{ set REPO=http://a7wj111:8080/svn/incubator/agf-sma-archetype svn mkdir %REPO% %REPO%/trunk %REPO%/tags %REPO%/branches -m "Creation du layout Subversion pour le projet agf-sma-archetype" }}}

Puis se mettre dans le répertoire racine du projet à importer, nettoyer tous les fichiers/répertoires indésirables, et lancer l'import comme suit :

{{{ svn import . http://a7wj111:8080/svn/incubator/agf-sma-archetype/trunk -m "Import initial du projet agf-sma-archety }}}


Q . Pour ignorer sous SVN (équivalent de '.cvsignore')

Pour ignorer sous SVN (équivalent de '.cvsignore'), il faut utiliser la commande suivante : {{{svn propset svn:ignore}}}

Exemples d'utilisation :

Pour ignorer les fichiers '.log' dans le répertoire courant : {{{svn propset svn:ignore "*.log" .}}}

Pour éditer le pattern d'ignore du répertoire courant (la property SVN_EDITOR doit être positionné). {{{svn propedit svn:ignore .}}}

Le pattern CVS des fichiers '.cvsignore' est réutilisable. {{{svn propset svn:ignore -F .cvsignore .}}}

documentation : http://svnbook.red-bean.com/en/1.1/ch07s02.html

NB : Il est possible d'ignorer pour l'ensemble du repository cf. ' global-ignores'( [<html>]<a href="http://svnbook.red-bean.com/en/1.1/ch07.html#svn-ch-7-sect-1.3.2">svnbook</a>[</html>])