Utilisation de SVN (Subversion)
Partie 1 : Le B.A.-BA du Quotidien (Le workflow de base)
Cette section couvre 99% de ce dont on a besoin pour travailler sur un projet au jour le jour avec SVN.
1. Configuration Initiale (à faire une seule fois)
SVN ne nécessite pas de configuration globale comme Git, mais vous pouvez personnaliser certains paramètres.
# Configuration optionnelle dans ~/.subversion/config
# Définir l'éditeur par défaut pour les messages de commit
export SVN_EDITOR=nano
# ou
export SVN_EDITOR=vim
2. Démarrer un projet
Option A : Récupérer un projet existant (Checkout) C'est le cas le plus courant. Vous récupérez un projet qui existe déjà sur un serveur SVN.
# Récupère (checkout) le projet dans un dossier du même nom
svn checkout https://svn.exemple.com/depot/trunk nom-du-projet
# ou plus court :
svn co https://svn.exemple.com/depot/trunk nom-du-projet
# Naviguez dans le dossier nouvellement créé
cd nom-du-projet
Option B : Importer un nouveau projet Si vous démarrez un projet de zéro et voulez l'ajouter au dépôt SVN.
# Créez la structure du projet localement
mkdir mon-super-projet
cd mon-super-projet
# Ajoutez vos fichiers...
# Importez le projet vers le serveur SVN
svn import . https://svn.exemple.com/depot/trunk/mon-super-projet -m "Import initial du projet"
# Supprimez le dossier local et faites un checkout pour avoir une copie de travail propre
cd ..
rm -rf mon-super-projet
svn checkout https://svn.exemple.com/depot/trunk/mon-super-projet
3. Le Cycle de Travail Fondamental
Le cycle SVN est : Modifier -> Ajouter -> Valider.
Étape 1 : Voir l'état du projet (svn status)
Cette commande vous dit quels fichiers ont été modifiés, lesquels sont nouveaux, et l'état de votre copie de travail.
?: Fichiers non versionnés (que SVN ne suit pas encore).M: Fichiers modifiés.A: Fichiers ajoutés (prêts à être commités).D: Fichiers supprimés.C: Fichiers en conflit.
Étape 2 : Ajouter des fichiers au contrôle de version (svn add)
Contrairement à Git, SVN n'a pas de zone de staging. Vous ajoutez simplement les fichiers au contrôle de version.
# Ajoute un fichier spécifique
svn add nom_du_fichier.html
# Ajoute tous les fichiers non versionnés du dossier courant
svn add --force .
Étape 3 : Valider les changements (svn commit)
Un commit en SVN envoie directement les changements vers le serveur et incrémente le numéro de révision global.
# Ouvre un éditeur de texte pour écrire un message de commit détaillé
svn commit
# Ou, pour un message court et direct :
svn commit -m "Ajout de la page de contact avec formulaire"
# Plus court :
svn ci -m "Ajout de la page de contact avec formulaire"
Bonne pratique : Les messages de commit doivent être clairs, concis et descriptifs (ex: "Ajout de la fonctionnalité X" ou "Correction du bug Y").
Étape 4 : Récupérer les changements du dépôt (svn update)
Pour récupérer les changements que vos collaborateurs ont commités.
# Met à jour votre copie de travail avec les derniers changements du serveur
svn update
# ou plus court :
svn up
Réflexe : Toujours faire un
svn updateavant de commencer à travailler pour éviter les conflits.
Partie 2 : Les Branches et Tags (Organisation du code)
SVN utilise une approche basée sur les répertoires pour les branches et tags, généralement organisés selon la convention /trunk, /branches, /tags.
1. Structure Standard d'un Dépôt SVN
/depot
/trunk (développement principal)
/branches (branches de développement)
/feature-x
/hotfix-y
/tags (versions releases)
/v1.0
/v1.1
2. Créer une Branche
# Créer une branche à partir du trunk
svn copy https://svn.exemple.com/depot/trunk \
https://svn.exemple.com/depot/branches/nouvelle-fonctionnalite \
-m "Création de la branche nouvelle-fonctionnalite"
# Basculer vers la branche (faire un checkout)
svn switch https://svn.exemple.com/depot/branches/nouvelle-fonctionnalite
# ou plus court :
svn sw https://svn.exemple.com/depot/branches/nouvelle-fonctionnalite
3. Changer de Branche
# Basculer vers le trunk
svn switch https://svn.exemple.com/depot/trunk
# Basculer vers une branche
svn switch https://svn.exemple.com/depot/branches/nom-de-la-branche
4. Fusionner les Branches (svn merge)
Une fois votre fonctionnalité terminée sur sa branche, vous voudrez la fusionner dans le trunk.
# 1. Basculez vers le trunk
svn switch https://svn.exemple.com/depot/trunk
# 2. Assurez-vous qu'il est à jour
svn update
# 3. Fusionnez votre branche DANS le trunk
svn merge https://svn.exemple.com/depot/branches/nouvelle-fonctionnalite
# 4. Commitez la fusion
svn commit -m "Fusion de la branche nouvelle-fonctionnalite"
5. Créer un Tag (Version)
# Créer un tag à partir du trunk
svn copy https://svn.exemple.com/depot/trunk \
https://svn.exemple.com/depot/tags/v1.0 \
-m "Tag version 1.0"
Partie 3 : Voyager dans le Temps et Corriger les Erreurs
SVN garde un historique complet de toutes les modifications avec des numéros de révision.
1. Consulter l'Historique (svn log)
# Historique complet
svn log
# Historique concis
svn log -q
# Historique avec les fichiers modifiés
svn log -v
# Historique entre deux révisions
svn log -r 100:200
2. Voir les Différences (svn diff)
# Différences entre votre copie locale et la dernière version du serveur
svn diff
# Différences d'un fichier spécifique
svn diff nom_fichier.txt
# Différences entre deux révisions
svn diff -r 100:105
3. Annuler des Modifications Locales
# Annule les modifications sur un fichier spécifique
# ATTENTION : C'est destructif, les changements sont perdus.
svn revert nom_du_fichier.txt
# Annule TOUTES les modifications dans le répertoire de travail
svn revert -R .
4. Revenir à une Révision Antérieure
# Met à jour votre copie de travail à une révision spécifique
svn update -r 150
# Revenir à la dernière révision
svn update
5. Annuler un Commit (svn merge inverse)
Pour annuler les changements d'une révision spécifique :
# Annule les changements de la révision 155
svn merge -c -155 .
# Commitez l'annulation
svn commit -m "Annulation des changements de la révision 155"
Partie 4 : Fonctionnalités Avancées de SVN
1. Propriétés SVN (svn propset)
SVN permet d'associer des métadonnées aux fichiers et répertoires.
# Définir le type MIME d'un fichier
svn propset svn:mime-type text/html index.html
# Ignorer certains fichiers (équivalent du .gitignore)
svn propset svn:ignore "*.log
*.tmp
build/" .
# Lister les propriétés d'un fichier
svn proplist nom_fichier.txt
# Voir la valeur d'une propriété
svn propget svn:ignore .
2. Verrouillage de Fichiers (svn lock)
Utile pour les fichiers binaires qui ne peuvent pas être fusionnés automatiquement.
# Verrouiller un fichier pour empêcher les modifications concurrentes
svn lock image.psd -m "Modification de l'image en cours"
# Déverrouiller le fichier
svn unlock image.psd
# Voir les verrous
svn status -u
3. Révisions et URLs
# Voir les informations sur votre copie de travail
svn info
# Voir les informations d'un fichier à une révision spécifique
svn info nom_fichier.txt@150
# Récupérer un fichier d'une révision spécifique
svn cat nom_fichier.txt@100 > ancien_fichier.txt
4. Résolution de Conflits
Quand deux personnes modifient le même fichier :
# Après un svn update qui génère des conflits, SVN crée plusieurs fichiers :
# - fichier.txt.mine (votre version)
# - fichier.txt.rXXX (version du serveur)
# - fichier.txt (fichier avec marqueurs de conflit)
# Résoudre en gardant votre version
svn resolve --accept mine-full fichier.txt
# Résoudre en gardant la version du serveur
svn resolve --accept theirs-full fichier.txt
# Résoudre manuellement après avoir édité le fichier
svn resolve --accept working fichier.txt
5. Inspection et Comparaison
# Voir qui a modifié chaque ligne d'un fichier (annotation)
svn blame nom_fichier.txt
# ou
svn annotate nom_fichier.txt
# Lister les fichiers modifiés dans une révision
svn log -v -r 155
# Exporter une révision spécifique (sans les métadonnées SVN)
svn export https://svn.exemple.com/depot/trunk@150 export-r150
Résolution de Problèmes
Sauvegarder les identifiants
# SVN peut sauvegarder les identifiants automatiquement
# Lors de la première connexion, répondez 'yes' à :
# "Store password unencrypted (yes/no)? yes"
# Les identifiants sont stockés dans ~/.subversion/auth/
# Pour forcer la re-saisie des identifiants :
svn update --username votre_nom_utilisateur