SVN - Subversion
EN COURS
Il existe de nombreux bons articles sur SVN, donc je ne vais pas faire une présentation détaillée, mais juste un résumé des points principaux. A la fin, je vous donne des liens vers des tutoriels en français.
Installation
La procédure d'installation diffère un peu suivant les distributions. Je les résume sur quelques distributions.
Installation sous OpenSuse
Testé sur une opensuse 12.3.
zypper in subversion groupadd svn useradd -m -d /srv/svn -s /bin/false -g svn svn mkdir /srv/svn/repos systemctl start svnserve.service systemctl enable svnserve.service
Remarques :
- le compte et le groupe svn ne sont pas créés à l'installation du package, alors qu'ils sont nécessaires au fonctionnement du service. Ou alors, il faut modifier le fichier de compte principal (/etc/sysconfig/svnserve) pour mettre un autre compte et groupe;
- le répertoire /srv/svn/ est créé à l'installation du package, mais pas le sous-répertoire /srv/svn/repos/. C'est probablement un bug, car il est indispensable au démarrage du service;
- la dernière commande (systemctl enable svnserve.service) est facultative. Elle ne sert que si on veut démarrer le service automatiquement au démarrage.
Installation sous Ubuntu
Testé sur une Linux Mint 15 (basée sur Ubuntu 13.04).
sudo apt-get install subversion sudo groupadd svn sudo useradd -m -d /var/svn -s /bin/false -g svn svn sudo /sbin/start-stop-daemon --start --chuid svn:svn --exec /usr/bin/svnserve -- -d -r /var/svn --pid-file /var/svn/svnserve.pid
Pour arrêter le serveur :
sudo /sbin/start-stop-daemon --stop --exec /usr/bin/svnserve sudo rm /svn/run/svnserve.pid
Remarque : l'installation ne créé pas de service, il va donc falloir le faire vous-même si vous en avez besoin.
Installation sous Fedora
Testé sur une Fedora 19.
yum install svn mkdir /var/svn groupadd svn useradd -d /var/svn -g svn -s /sbin/nologin svn chown -R svn.svn /var/svn chmod 4774 /usr/bin/svnserve /usr/bin/svnserve -d -r /var/svn --pid-file /var/svn/svnserve.pid
Pour arrêter le serveur :
cat /var/svn/svnserve.pid | xargs kill rm -f /var/svn/svnserve.pid
Remarques :
- l'installation ne créé pas de service, il va donc falloir le faire vous-même si vous en avez besoin (voir ci-dessous);
- on est obligés de créer d'abord le répertoire, puis le compte svn, puis de faire un chown sur le répertoire à cause de SELinux qui interdit de créer le répertoire à la création du compte.
Exemple de daemon (collez ceci dans un fichier /etc/init.d/svn) :
#!/bin/bash # # SVN daemon # # chkconfig: 345 99 01 # description: SVN daemon for Redhat like distribution. # PID_FILE="/var/svn/svnserve.pid" start() { if [ -e $PID_FILE ] then echo "SVN seems to be already running (pid: `cat $PID_FILE`)." exit 1 else echo "Starting SVN." RESULT=$(/usr/bin/svnserve -d -r /var/svn --pid-file $PID_FILE >/dev/null 2>/tmp/svn-daemon.log) RET=$? fi if [ $RET -eq 0 ] then echo "Done." else echo "Error. Problem starting SVN." cat /tmp/svn-daemon.log rm /tmp/svn-daemon.log fi } stop() { if [ -e $PID_FILE ] then echo "Stopping SVN." RESULT=$(cat $PID_FILE | xargs kill >/dev/null 2>/tmp/svn-daemon.log) RET=$? if [ $RET -eq 0 ] then echo "Done." rm -f /var/svn/svnserve.pid else echo "Problem stopping SVN." cat /tmp/svn-daemon.log rm /tmp/svn-daemon.log fi else echo "SVN is already stopped." exit 1 fi } restart() { stop start } status() { if [ -e $PID_FILE ] then PID=$(cat $PID_FILE) RESULT=$(ps aux|grep $PID|grep -v grep 2>/dev/null) RET=$? if [ $RET -ne 0 ] then echo "Error: $PID_FILE exist but no corresponding process is running." else echo "SVN is running (pid: $PID)." fi else echo "SVN is stopped." fi } case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) status ;; *) echo $"Usage: $0 {start|stop|restart|status}" esac exit
Pour l'activer au démarrage :
chkconfig --add svn
Utilisation de base
Création d'un dépôt sur le serveur (svnadmin create)
La première chose à faire est de créer un dépôt sur le serveur pour que les clients puissent travailler.
svn create /chemin/vers/le/repertoire/de/destination
Le chemin peut être indiqué en chemin absolu ou relatif. Le répertoire final sera créé s'il n'existe pas, mais ses parents doivent exister.
Cette commande a créé un projet qui ne contient pour l'instant que des fichiers utiles à son fonctionnement, mais il n'a pas encore de fichiers qui lui sont propres. Nous allons ajouter des fichiers depuis les clients.
Récupérer un projet (svn checkout)
Maintenant il faut nous mettre sur un poste client (qui peut être le même que le serveur). Voici la commande pour récupérer un projet :
svn checkout file:///chemin/vers/le/depot/du/projet /chemin/destination
Le chemin source peut prendre différentes formes, par exemple :
- file:///chemin/vers/le/depot/du/projet
- http://serveur.svn/depot
- svn://serveur.svn/depot
Le chemin de destination peut être en relatif ou en absolu.
Cette commande n'est normalement utilisée qu'une fois, quand on rapatrie le projet en local pour la première fois. Tous les fichiers du projet sont récupérés, ce qui peut être long si on récupère un gros projet. Cette commande crée un répertoire caché .svn dans le répertoire de destination.
Nous sommes maintenant prêts à travailler sur le projet.
Mettre à jour sa copie locale (svn update)
svn update /chemin/copie/locale
Si on se trouve dans le répertoire de destination, il n'est pas utile de mettre le chemin. On peut également se contenter de taper
svn up
Il est fortement recommandé de taper cette commande avant de travailler sur un projet, car elle met à jour la copie locale avec la dernière version disponible sur le dépôt. Comme ça, si quelqu'un a travaillé entre temps sur le projet, on récupère également ses modifications. Ne pas le faire peut poser des problèmes.
Ajouter un fichier au projet (svn add)
Nous allons maintenant ajouter notre premier fichier à notre projet. Pour cela, il faut d'abord créer un fichier avec du contenu. Par exemple :
date >> date.txt
Nous avons maintenant un nouveau fichier dans notre copie locale. Mais ça ne suffit pas, il faut encore dire à svn de l'ajouter au projet avec la commande "svn add" :
svn add date.txt
Le chemin du fichier peut être absolu ou relatif. Ici, on ne précise pas le nom du projet, puisque le répertoire dans lequel on travaille est déjà associé à un projet.
A ce stade, le fichier date.txt n'est toujours pas ajouté au projet. Nous avons simplement indiqué à svn qu'il faudra l'ajouter lors du prochain commit. En effet, sous svn, on commence par l'informer de tout ce qu'on va ajouter, supprimer, déplacer, etc. Et une fois qu'on a listé toutes les actions, on va valider tout d'un coup avec la commande commit que nous allons voir tout de suite.
Mettre à jour le dépôt (svn commit)
La syntaxe est la suivante :
svn commit -m "commentaire"
Le commentaire est fortement conseillé pour décrire brièvement ce qui a été modifié par rapport à la dernière version. D'ailleurs, si on ne met pas l'option -m "commentaire", on va se retrouver dans l'éditeur par défaut pour en mettre un. Si on ne veut vraiment pas en mettre, alors il faut mettre -m "" (des guillemets vides).
Cette commande va créer une nouvelle version du projet sur le serveur en appliquant toutes les modifications apportées à notre copie locale.
Si un fichier a été modifié depuis la dernière version, il n'y a pas besoin de faire un "add" puisqu'il est déjà intégré au projet. Donc il suffit de faire "svn commit" pour que ses modifications soient intégrées à la nouvelle version du projet.
Supprimer, copier, déplacer des fichiers (svn delete, svn copy, svn move)
Comme pour l'ajout de fichier, il faut faire attention, il faut bien avoir en tête que l'arborescence locale n'a pas forcément de rapport avec l'arborescence du projet. En effet, il ne suffit pas d'ajouter, déplacer ou supprimer un fichier pour qu'il se retrouve au même endroit sur le dépôt. Il faut obligatoirement utiliser les mots clés internes à svn. Voici trois exemples pour, respectivement, supprimer, copier et déplacer un fichier :
svn delete fichier svn copy fichier destination svn move fichier destination
N'oubliez pas de faire svn commit après.