Subversion

De WikiBR
Révision datée du 17 septembre 2005 à 20:25 par Fruneau (discussion | contributions) (plus beau (enfin bon :))

La SVN (petit nom de SubVersion) a pour but de remplacer la CVS. Pour l'utilisateur lambda, l'utilisation en est quasiment identique, mais les fonctionnalité supplémentaires sont tout de même non négligeables. Cette page explique comment importer la CVS dans SVN proprement et comment configurer les repositories pour que les accès soit limités comme désiré.

Elle est actuellement sur Skinwel pour 2 raisons :

  • pour éviter de se retrouver comme la CVS sur Gwennoz auquel trop de personnes ont accès
  • parce que skinwel héberge très peu de services

Installation de SVN

Installation du programme

L'installation comporte plusieurs éléments : SubVersion, le viewer Web, le mailer, le script d'import de CVS...

apt-get install subversion subversion-tools cvs2svn websvn svnmailer

Il faut alors créer le compte utilisateur svn

adduser svn
mkdir /home/svn
chown svn:root /home/svn

Création des repositoires

SVN gérant projet par projet, il faut séparer les projets. On va donc créer un repositoire par projet :

svnadmin create --fs-type fsfs /home/svn/nom_du_projet

Une fois le repositoire créé, il faut réaliser l'import depuis la CVS :

cd /tmp
scp -r gwennoz:/home/cvs cvs
cvs2svn --existing-svnrepos -s /home/svn/nom_du_projet cvs/nom_du_projet

Il faut répéter l'opération pour tous les projets...

Si un projet a des sous projets importants, il faut vaut mieux créer un repositoire pour chaque sous projet important

Lancement du serveur

SVN utilise son propre serveur. Celui-ci se lance simplement en appelant le daemon svnserver. Pour plus de sécurité, ou pour aussi plus de clarté, on rajoute un chroot :

sudo -u svn svnserve -d -r /home/svn

Configuration des repositoires

La svn sert à stocker différents type de données :

  • des projets publics
  • des projets privés
  • des données de configuration

Il faut donc une configuration spécifique pour chaque type de projet. Les configurations se font via :

  1. la configuration du repositoire (répertoire /home/svn/projet/conf/)
  2. les droits d'accès au répertoire.

Projet public

Un projet public est un projet dont les sources sont publiques accessibles à tous. Pour un tel projet on doit avoir :

  • un accès anonyme en lecture
  • des accès lecture/écriture pour les développeurs
  • un accès au websvn

droit d'accès au repositoire

Les droits d'accès par défaut (644 ou 755) sont corrects, le projet étant public. Ils permettent à la fois l'accès via svnserve, web et svn+ssh. Il suffit simplement de donner la propriété du répertoire au bon utilisateur

cd /home/svn
chown svn -R nom_du_projet

configuration du serveur svn

Le fichier svnserve.conf doit être de la forme :

# Global Section
[general]
# Name of the project
realm = le nom du projet

# Read-only anonyme access
anon-access = read
# Read/Write access for authentified users
auth-access = write

# Where to find authorised users list
password-db = /home/svn/passwd

Et remplir le fichier de /home/svn/passwd est un fichier partagé par tous les repositories public, et les projets privés. Il doit avoir des droits d'accès restrictifs (600 en svn:root).

# User list
[users]
name_user1 = password_user1
name_user2 = password_user2
name_user3 = password_user3
...

configuration du websvn

Le websvn doit afficher se projet, il faut donc l'indiquer. Pour ceci il suffit d'éditer le fichier /etc/websvn/svn_deb_conf.inc et d'ajouter la ligne :

$config->addRepository("nom du projet", "/home/svn/nom_du_projet");

Projets privés

Les projets privés sont des projets internes au BR dont les sources ne sont pas diffusées. Il bénéficie donc d'un accès en lecture/écriture pour les développeurs... et rien d'autre.

droits d'accès au repositoire Il faut bien s'assurer que l'accès au répertoire est limité aux seuls personnes qui ont le droit d'accès... c'est à dire au serveur svn

cd /home/svn
chmod g-rwx -R projet
chmod o-rwx -R projet
chown svn -R projet

Configuration du serveur svn

Le fichier svnserve.conf doit être de la forme :

# Global Section
[general]
# Name of the project
realm = le nom du projet

# Only known users can access
anon-access = none
# Read/Write access for authentified users
auth-access = write

# Where to find authorised users list
password-db = /home/svn/passwd

Et remplir le fichier de /home/svn/passwd est un fichier partagé par tous les repositories public, et les projets privés. Il doit avoir des droits d'accès restrictifs (600 en svn:root).

# User list
[users]
name_user1 = password_user1
name_user2 = password_user2
name_user3 = password_user3
...

Fichiers de configuration

Les fichiers de configuration vivent dans un autre monde... dans lequel il faut absolument éviter tout accès pirate à la machine. Pour ceci le mieux est d'utiliser la méthode parano de l'authentification via ssh et du transfert via svn over ssh. La configuration est très simple

droits d'accès

Le svn+ssh utilise le compte de l'utilisateur sur la machine, il faut donc que tous les utilisateurs qui l'utilisent aient un compte sur la machine. Les droits d'accès aux fichiers sont ceux de l'utilisateur. Il faut donc placer les newsmestres dans le group news et les roots dans le groupe adm.

Ensuite :

cd /home/svn
chmod o-rwx -R projet
chmod g+w -R projet
chown svn:news -R news //Dans le cas de la conf des newsgroups
chown svn:adm -R projet //Dans le cas des utilitaires root

configuration du serveur svn

# Global Section
[general]
# Name of the project
realm = le nom du projet

# Only known users can access
anon-access = none
# Read/Write access for authentified users
auth-access = write

# No svn authentificcation... it uses Unix's one
# password-db = passwd

Structure d'un projet sur la SVN

Les projets de développement (donc on exclu les modules de configuration) ont tous à peu près la même structure. Cette structure reflette le développement : - trunk : la branche principale du projet. - branches : répertoire qui contient les autres branches sous la forme de sous répertoire - tags : répertoire que contient les versions tagguées sous la forme de sous répertoire.

Ainsi, un exemple concret est qRezix :

svn://swl/qrezix/
  + trunk
  + branches
  |   + qrezix--qt4
  |   + qrezix--release--1.2
  |   + qrezix--release--1.6.2
  |   \ qrezix--release--1.6.3
  \ tags
      + qrezix--1.3
      + qrezix--1.6.2
      + qrezix--1.6.2-rc1
      + qrezix--1.6.2-rc2
      \ qrezix--1.6.3

Utilisation de svn

SVN s'utilise aussi simplemennt que CVS avec cependant quelques différences notables, en particulier la checkout utilise une syntaxe différente

Le principe d'une SVN est de centraliser le développement en fournissant un moyen simple de programmer en groupe. Chaque développeur a chez lui une copie personnelle du projet sur laquelle il fait ses modifications. Quand il est satisfait, il valide ses modifications (commit) et tout le monde peut y avoir accès.

La SVN gère également des branches qui permette de continuer à développer sur une branche 'instable' pendant qu'on décide de 'releaser' une version stable.

Chaque projet est appelé un module.

Récupérer un module

La commande diffère selon que le module est accessible via le svnserver ou svn+ssh :

en svn :

svn co svn://[user@]skinwel/nom_du_projet/partie_a_co [destination]

en svn+ssh :

svn co svn+ssh://user@skinwel/home/svn/nom_du_projet/partie_a_co [destination]

Pour la plupart des utilisateurs la partie à co sera trunk, mais ça peut être aussi branches/nom_de_la_branche, ou Tag/nom_du_tag... ou n'importe quel sous répertoire...

Récupérer les modifications des autres

svn up [$fichiers$]

Récupère la dernière copie des fichiers spécifiés. Si aucun fichier n'est récupérer, le programme mettra à jour tout le répertoire et ce récursivement. En cas de modification conflictuelle entre celle du serveur et celle de la copie local, il faut résoudre le conflit.

Valider ses modifications

svn ci [$fichiers$]

Cette commande envoie au serveur les fichiers modifiés. Si aucun conflit n'est détecté la modification est validée.

Il faut toujous updater la copie locale avant de commiter ses modifications.

Annuler ses modification

svn revert [$fichiers$]

Supprime toutes les modifications apportées au fichier spécifié depuis le dernière update.

Cette commande est la seule qui ne soit pas récursive avec SVN. Pour utiliser la commande sur un répertoire de façon récursive, il faut ajouter l'option -R

svn revert -R [$répertoire$]

Ajouter un fichier/répertoire

svn add $fichiers$
svn mkdir $repertoire$

Ajoute les fichiers spécifiés à la CVS. Les répertoires sont ajoutés immédiatement, par contre il faut commiter les fichiers ajoutés pour valider l'ajout. L'utilisation de mkdir nécessite que le répertoire n'existe pas encore.

Supprimer un fichier/répertoire

svn remove $fichiers$
svn rmdir $repertoire$

Supprime un fichier du module. La suppression sera effective après un commit.

Déplacer un fichier/répertoire

svn move $fichier$ $destination$

Déplace le fichier ou répertoire vers sa destination. Ce comporte comme mv.

Créer une version tagguée

Une version tagguée est un snapshot du projet, une photographie à un instant présent. Sur svn, un snapshot est donc une copie de l'instant présent dans l'arborescence. Le plus souvent on utilise un répertoire tag :

svn copy trunk tag/$montag$

Créer une branche

De la même manière que les tags, les branches sont une séparation du projet. C'est donc également une copie, mais celle-ci destinée à évoluer... On stock habituellement les branches dans un répertoire branches :

svn copy trunk branches/$mabranche$

Backporter

Backporter consiste à transposer les modifications d'une branche sur une autre.

svn merge -r version1:version2 $brancheorigine$ [$branchedest$]
svn ci

Cette syntaxe applique les modifications de la branche $brancheorigine$ effectuées entre la révision version1 et version2 (dans cet ordre là) ) la branche branchedest. Si branchedest n'est pas spécifié, l'application sera réalisée sur le répertoire courant.

Attention à mettre version1 et version2 dans le bon sens, sinon on supprime les modifications au lieu de les appliquer.

Installation de la SVN sous Windows

Un bon client SVN sous Windows est TortoiseSVN qui s'intègre à l'explorateur Windows et permet de réaliser toutes les comamndes grace au menus contextuels associés aux répertoires.