Subversion : installation et utilisation
Après CVS (qui mérite sa retraite), Subversion. Le VCS centralisé qui a fait la transition entre le commit-lock de CVS et le modèle distribué qui viendra après. Le principe est simple: un serveur central (svnserve ou Apache + mod_dav_svn), des clients qui checkout, commit, update. Un seul historique, un seul point de vérité et un numéro de révision global qui incrément à chaque commit.
Installation
apt-get install subversion subversion-tools
# Créer le dépôt
svnadmin create /srv/svn/monprojet
# Démarrer le serveur standalone
svnserve -d -r /srv/svn
Le mode svnserve est le plus simple: pas de Apache, pas de mod_dav, un daemon qui écoute sur le port 3690. Pour l’accès web, il faut Apache + mod_dav_svn (voir l’article suivant).
Le checkout et le workflow
# Checkout initial
svn checkout svn://monserveur/monprojet/trunk monprojet
# Workflow quotidien
svn update
svn add nouveau_fichier
svn commit -m "Description du changement"
svn status
svn diff
svn log
Le workflow est checkout-commit-update: on checkout une copie locale, on modifie, on commit vers le serveur. Si quelqu’un a commité avant vous, svn demande un update avant le commit. Les conflits sont marqués dans les fichiers (les fameuses lignes <<<<<<< et >>>>>>>) et svn resolved les marque comme réglés.
Les branches
Les branches SVN sont des répertoires (copies pas chères grâce aux hard links internes):
svn copy svn://monserveur/monprojet/trunk \
svn://monserveur/monprojet/branches/ma-branche \
-m "Creation de la branche"
Le merge est là où SVN pèche: svn merge fonctionne, mais suivre les révisions mergées est manuel (le svnmerge.py venait en aide avant d’être intégré). Git a résolu ce problème avec le graphe de commits et c’est la raison principale de la migration.
Les hooks
Les hooks SVN sont des scripts shell dans hooks/ du dépôt:
#!/bin/bash
# hooks/pre-commit: vérifier le message de commit
REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
LOG=$($SVNLOOK log -t "$TXN" "$REPOS")
if [ ${#LOG} -lt 10 ]; then
echo "Message de commit trop court (10 caracteres minimum)." >&2
exit 1
fi
Le hook pre-commit refuse le commit si le message est trop court. Les hooks post-commit déclenchent un build, envoient un mail, mettent à jour un dépôt de production par rsync. C’est l’ancêtre du CI, en bash.
[edit: 2026] Subversion est toujours maintenu par Apache (depuis la migration de Tigris en 2010), toujours utilisé dans les entreprises qui ont des historiques SVN de 15 ans et pas de raison de migrer. Le paysage VCS de 2006: CVS en fin de vie, SVN en montée, Mercurial et Bazaar en émergence (les deux distribués comme Git mais plus simples), Perforce en entreprise (le VCS commercial à licences). Git est arrivé en 2005 (né du besoin de Linus après la perte d’accès à BitKeeper), mais son adoption a pris des années. En 2008, SVN était le standard, Git était le nouvel arrivant, Mercurial était le concurrent le plus proche. L’histoire a tranché, mais SVN a mérité sa décennie.