Ceci est une ancienne révision du document !
Table des matières
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)
Creer un repertoire-projet (ou un repertoire pour des projets ?)
Ici, le repertoire-projet est test1. (ces notions sont aussi flou qu'un répertoire…)
$ svnadmin create /svn/dev/test1 $ la /svn/dev/test1 total 36 drwxr-sr-x 7 thierry svn-dev 4096 2006-09-11 00:58 . drwxrwsr-x 3 svn-dev svn-dev 4096 2006-09-11 00:58 .. drwxr-sr-x 2 thierry svn-dev 4096 2006-09-11 00:58 conf drwxr-sr-x 2 thierry svn-dev 4096 2006-09-11 00:58 dav drwxr-sr-x 5 thierry svn-dev 4096 2006-09-11 00:58 db -r--r--r-- 1 thierry svn-dev 2 2006-09-11 00:58 format drwxr-sr-x 2 thierry svn-dev 4096 2006-09-11 00:58 hooks drwxr-sr-x 2 thierry svn-dev 4096 2006-09-11 00:58 locks -rw-r--r-- 1 thierry svn-dev 229 2006-09-11 00:58 README.txt
Importe un **project**existant dans le repertoire **test1**:
D'abord, creer un repertoire provisoire, par exemple dans ~/tmp et que nous nommerons sertest :
$ mkdir sertest
Créeons dans ce répertoire, une arborescence comme suit:
$ cd sertest $ 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 -R ~/quelque/part/sertest/* ./trunk/
Enfin, on importe tout cela dans subversion :
$ cd ~/tmp $ la sertest 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à ou il faut… le repertoire parent de mon projet… Importons donc:
$ svn import myproject file:///svn/dev/test1/myproject -m "initial import for test" Ajout myproject/trunk ... snip ... Ajout myproject/trunk/my_debug.c Ajout myproject/branches Ajout myproject/tags
Révision 1 propagée.
Recuperer des fichiers tout neuf du repository:
Ce mettre dans le répertoire parent du projet:
$ svn checkout file:///svn/dev/test1/myproject/trunk sertest
Un repertoire sertest est créé avec l'injections de 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 sertest.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/test1/myproject Chemin : myproject URL : file:///svn/dev/test1/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)
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
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…
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