Outils pour utilisateurs

Outils du site


environnement_prog_svn

Ceci est une ancienne révision du document !


SVN - Subversion

Un concurrent de CVS

Liens:

subversion pour windows et aide
Quick Start(en)
Cours svn (trés complet)
Chapter 5. Repository Administration

 # apt-get update
 # apt-get install subversion
 $ svn --version
 svn, version 1.3.2 (r19776)
     compilé Aug 15 2006, 08:51:49

 Copyright (C) 2000-2006 CollabNet.
 Subversion is open source software, see http://subversion.tigris.org/
 This product includes software developed by CollabNet (http://www.Collab.Net/).

 Les modules d'accès à un dépôt (RA) suivants sont disponibles :

 * ra_dav : Module for accessing a repository via WebDAV (DeltaV) protocol.
   - handles 'http' scheme
   - handles 'https' scheme
 * ra_svn : Module pour accéder à un dépôt avec le protocole réseau propre de svn
   - handles 'svn' scheme
 * ra_local : Module for accessing a repository on local disk.
   - handles 'file' scheme

Quick start

Repertoire des "repository"

Creer le répertoire de stockage, en attribuant le groupe src.

# mkdir /var/lib/svn

Creer un lien a la racine, pour clarifier la suite.

# ln -s /var/lib/svn /svn

Par exemple, creer un sous-repertoire dev.

# mkdir /svn/dev

Créer le user svn

# adduser svn --system --disabled-login --no-create-home --group

On l'utilisera par la suite, car il sera le seul autorisé a manipuler directement les repository

Installer le daemon "svnserve"

D'abord preparer un repertoire pour recevoir le PID (generer par le user svn).

# mkdir /var/run/svn
# chown :svn /var/run/svn
# chmod g+ws /var/run/svn

Installer un scripte comme ça là: /etc/init.d/svnserve-daemon

#!/bin/sh

NAME="svnserve-daemon"
DESC="subversion"

SVNDAEMON="/usr/bin/svnserve"

[ -x $SVNDAEMON ] || exit 0

PIDFILE="/var/run/svn/svnserve.pid"
LISTENPORT="3690"
SVNPATH="/svn"
SVNUSER="svn:svn"

start()
{
  echo -n "Starting $DESC: $NAME"
  start-stop-daemon --start --quiet --exec "$SVNDAEMON" \
  -c "$SVNUSER" -- -d --listen-port "$LISTENPORT" -r "$SVNPATH" --pid-file "$PIDFILE"
  echo "."
}

stop()
{
  echo -n "Stopping $DESC: $NAME"
  start-stop-daemon --stop --quiet --pidfile "$PIDFILE"
  # effacer le fichier PID (je prefere)
  [ ! -e "$PIDFILE" ] || rm "$PIDFILE"
  echo "."
}

case "$1" in
  start)
      start
      ;;
  stop)
      stop
      ;;
  restart)
      stop
      sleep 1
      start
      ;;
  *)
      echo "Usage ... {start|restart|stop} " >&2
      exit 64
      ;;
esac
exit 0

Noter que ce daemon “voit” tout les “repository” dans /svn.
Faire en sorte que ça fonctionne au reboot.

# update-rc.d svnserve-daemon defaults

Creer un "repository"

# svnadmin create /svn/dev/myproject

Cela doit appartenir au user svn.

# chown -R svn:svn /svn/dev/myproject

A ce stade, si le daemon tourne, la terre entière qui passe par le port TCP (3690) peut modifier le projet!
Mettre des restrictions:

# cd /svn/dev/myproject/conf
# vi passwd
...
[users]
thierry = mot_de_passe
...

Editer aussi …

# vi svnserve.conf
...
[general]
anon-access = none
auth-access = write
...
password-db = passwd

Et voila un repository protégé… mais je crois que les mots de passe voyagent en clair (à vérifier)

Importe un "project" existant...

(Ou simplement créer un “project” vide)
D'abord, créer un répertoire provisoire, par exemple dans ~/tmp/myproject :

 $ cd ~/tmp
 $ mkdir myproject
 $ cd myproject

Créeons dans ce répertoire, une arborescence comme suit:

 $ mkdir trunk
 $ mkdir branches
 $ mkdir tags

Laisser tags et branches vide. (y parait que c'est bien…).

Copier les fichiers du projet dans trunk:

 $ cp -Rp ~/quelque/part/* ./trunk/

Et enfin, on importe tout cela dans subversion :

 $ cd ~/tmp
 $ la myproject
 total 20
 drwxr-xr-x 5 thierry thierry 4096 2006-09-11 01:02 .
 drwxr-xr-x 3 thierry thierry 4096 2006-09-11 01:04 ..
 drwxr-xr-x 2 thierry thierry 4096 2006-09-11 01:02 branches
 drwxr-xr-x 2 thierry thierry 4096 2006-09-11 01:02 tags
 drwxr-xr-x 4 thierry thierry 4096 2006-04-26 23:19 trunk

On est bien là où il faut… le répertoire parent de mon projet… Importons donc:

$ svn import myproject svn://localhost/dev/myproject -m "initial import"
Domaine d'authentification : <svn://localhost:3690> ffffffff-DDDD-4444-8888-77777777
Mot de passe pour 'thierry' :
Ajout          myproject/trunk
...
 Révision 1 propagée.

Rappel: on passe par le daemon qui tourne en 'localhost', sinon, on aurait pu faire (si on avait les droits d'écrire dans /svn/dev/bourse)

 $ svn import myproject file:///svn/dev/myproject -m "initial import for test"
 Ajout          myproject/trunk
 ...
 Révision 1 propagée.

Où sont les mots de passe...

Par la suite, les mots de passe ne seront plus demandé ! Ils sont stockés dans:

~/.subversion/auth/svn.simple

Recuperer des fichiers tout neuf du repository:

Ce mettre dans le répertoire parent du projet:

Via le daemon:

 $ svn checkout svn://localhost/dev/myproject/trunk myproject

ou plus généralement:

 $ svn checkout svn://Adresse_IP/dev/myproject/trunk myproject

Sans le daemon:

 $ svn checkout file:///svn/dev/myproject/trunk myproject

Un repertoire myproject est créé avec tous les fichiers associés (de trunk).

Modifions des choses…

 $ vi ... etc...


 $ svn update
 $ svn commit -m "j'ai fait des p'tains de modifs!"
 Envoi          monprojet.c
 Transmission des données .
 Révision 3 propagée.
 $ svn add newfile.c
 $ svn update
 $ svn commit -m "un nouveau fichier"
 Ajout          newfile.c
 Transmission des données .

Tiens, des infos:

 $ svn info file:///svn/dev/myproject
 Chemin : myproject
 URL : file:///svn/dev/myproject
 Racine du dépôt : file:///svn/dev/test1
 UUID du dépôt : xxxx
 Révision : 4
 Type de noeud : répertoire
 Auteur de la dernière modification : thierry
 Révision de la dernière modification : 4
 Date de la dernière modification: 2006-09-11 01:39:56 +0200 (lun, 11 sep 2006)

Ou bien aussi:

 $ svn info svn://10.20.1.111/dev/myproject
 ...

Pour recuperer la revision 3 (par exemple), et dans le repertoire r3:

 $ svn checkout file:///svn/dev/test1/myproject r3 -r 3

Utiliser svn status pour voir ce qu'on modifié localement. (alors que svn update fait une verification avec le repository)

 $ svn log

C'est bien aussi.

svnlook

Regarder l'arbre:

 $ svnlook tree /svn/dev

Imprimer un fichier de l'arbre

 $ svnlook cat /svn/dev labo/book/trunk/ex2.c

Mais si on est dans un répertoire 'checkouted' on peut aussi faire:

 $ svn info

ou

 $ svn ls -v

ou

 $ svn cat lefichier

Annuler toutes les modifications locales:

 $ svn revert PATH

Et on revient a l'etat du dernier 'update' ou 'checkout'

Ce qui a été modifié:

 $ svn log [PATH] -v

En cas de deplacement d'un repository:

 $ svn switch --relocate FROM_URL TO_URL

Installer en serveur avec SSH

droits

Il faut préalablement s'assurer que l'utilisateur aura les droits de lire et/ou modifier le repository. Pour repartir des exemples ci-dessus:

chmod -R g+ws /svn/dev/myproject

Cas simple

C'est fort simple, il n'y a rien (?) a faire sur le serveur, l'authentification par SSH est suffisante. Donc sur le client, faire un truc du genre:

 $ svn checkout svn+ssh://thierry@k7/svn/dev/app/trunk app

Et aprés la demande du mot de passe 3 fois (et oui!) on a enfin recupéré les fichiers qui sont dans le répertoire app. Ensuite, on peut modifier les fichiers etc… et faire les commandes habituelles:

 $ cd app
 $ svn update
 $ svn commit -m "j'ai fait des trucs"

Et a chaque fois que necessaire, un passe est demandé.

SSH sur un autre port

Sur le client, editer le fichier ~/.subversion/config et ajouter cela dans la section [tunnels] :

 k7 = ssh -p 5322

Alors a l'invocation de svn+k7, ssh sera appellé avec le paramètre -p 5322 qui est le port ouvert pour SSH… Waouh…

 $ svn checkout svn+k7://thierry@k7/svn/dev/app/trunk app

Et c'est relativement long, et ca demande 3 fois le mot de passe…

svnserve et inetd

C'est finalement mieux et plus simple qu'un daemon.
Editer le fichier /etc/inetd.conf et inserer:

svn     stream  tcp     nowait  svn     /usr/bin/svnserve   svnserve -i -r /svn

Puis forcer le rechargement du fichier de conf en faisant:

# ps aux | grep inetd
root      3209  0.0  0.0   1748   576 ?        Ss   May21   0:00 /usr/sbin/inetd

Et enfin:

# kill -HUP 3209

Et voila.

Sauver et restaurer

Utiliser le jeu de commande dump et load avec svnadmin.

Extraire un dump dans un fichier:

 $ svnadmin dump /svn/dev/app >app-dump.svn

Ensuite, pour l'exemple, on cree un nouveau repository:

 $ svnadmin create /svn/dev/new-app

Et puis on charge dedans:

 $ cat app-dump.svn | svnadmin load /svn/dev/new-app
environnement_prog_svn.1179924772.txt.gz · Dernière modification : 2007/05/23 12:52 de thierry