SVN - Subversion

De UnixManiax
Aller à la navigation Aller à la recherche
La version imprimable n’est plus prise en charge et peut comporter des erreurs de génération. Veuillez mettre à jour les signets de votre navigateur et utiliser à la place la fonction d’impression par défaut de celui-ci.


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. Il y a un exemple de service dans l'installation pour Fedora.

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.

svnadmin 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 :

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.

Liens