Un post très rapide pour gérer son repository svn d'un projet. La vanne foireuse de mon titre est une phrase que je me suis dit la première fois que j'ai vu un repository svn. Au final cela ne demande pas grande connaissance quelques commandes et de la logique.


Organisation du dépôt

On crée le dépot rep, on fait un checkout de celui-ci dans une copie de travail "work", puis on crée les 3 répertoires de notre organisation.

ioo@particules:~/test$ mkdir rep work
ioo@particules:~/test$ svnadmin create rep
ioo@particules:~/test$ svn co file:///home/ioo/test/rep/ work/
Révision 0 extraite.

ioo@particules:~/test$ svn mkdir work/branches work/tags work/trunk
A         work/branches
A         work/tags
A         work/trunk

ioo@particules:~/test$ svn ci -m "mise en place svn" work/
Ajout          work/branches
Ajout          work/tags
Ajout          work/trunk

Révision 1 propagée.

Bien évidement si votre projet ne va pas durer, même pas besoin d'un trunk, mais bon pour l'exemple, imaginons que vous vous lancez dans un framework[1]


Utilisation des tags

Vous faites donc un magnifique framework.txt et mettez vos fichiers dans trunk au départ

ioo@particules:~/test$ cd work/trunk
ioo@particules:~/test/work/trunk$ touch framework.txt
ioo@particules:~/test/work/trunk$ echo MVC > !:1
ioo@particules:~/test/work/trunk$ svn add framework.txt
A         framework.txt

ioo@particules:~/test/work/trunk$ svn ci -m "ajout de mon framework"
Ajout          trunk/framework.txt
Transmission des données .
Révision 2 propagée.

Je vous ai fait une petite basherie comme ça gratos ! Maintenant cette première version de votre framework vous créez une release parce-qu'elle est stable et que vous voulez la déployez. Il suffit de copier avec svn le contenu du répertoire trunk dans tags. Notez le "trunk" sans "/" à la fin

ioo@particules:~/test/work$ cd ..
ioo@particules:~/test/work$ svn copy trunk tags/release_1
A         tags/release_1
ioo@particules:~/test/work$ svn ci -m "création release 1"
Ajout          tags/release_1
Ajout          tags/release_1/framework.txt
Transmission des données ...
Révision 3 propagée.


Utilisation des branches

Maintenant imaginez que vous prévoyez de modifier votre framework en lui donnant une vraie structure MVC "model.txt" "view.txt" et "controller.txt"[2] Vous vous retrouvez avec deux versions à gérer avec deux développements distincts.

Vous créez votre branche 1.0 à partir du "trunk"[3] et votre nouvelle branches 2.0 directement.

ioo@particules:~/test/work$ svn copy trunk branches/1.0
A         branches/1.0
ioo@particules:~/test/work$ svn mkdir branches/2.0
A         branches/2.0
ioo@particules:~/test/work$ svn ci -m "créations des branches de dev"
Ajout          branches/1.0
Ajout          branches/1.0/framework.txt
Ajout          branches/2.0

Révision 4 propagée.

Vous pouvez tranquillement créer votre nouvelle version de framework

ioo@particules:~/test/work$ touch branches/2.0/model.txt branches/2.0/view.txt branches/2.0/controller.txt
ioo@particules:~/test/work$ svn add branches/2.0/*
A         branches/2.0/controller.txt
A         branches/2.0/model.txt
A         branches/2.0/view.txt
ioo@particules:~/test/work$ svn ci -m "dev de ma branche 2"
Ajout          branches/2.0/controller.txt
Ajout          branches/2.0/model.txt
Ajout          branches/2.0/view.txt
Transmission des données ...
Révision 5 propagée.


Mais c'est pas fini....va falloir merger !

Et oui en faisant comme cela vous pouvez avoir de gros problèmes, je sais pas quelqu'un qui continue à travailler dans le "trunk" et qui clôture sympathiquement vos tickets.

ioo@particules:~/test/work$ echo changements > trunk/framework.txt
ioo@particules:~/test/work$ touch trunk/addons.txt
ioo@particules:~/test/work$ svn add trunk/addons.txt
A         trunk/addons.txt
ioo@particules:~/test/work$ svn ci -m "correction bug #211"
Ajout          trunk/addons.txt
Envoi          trunk/framework.txt
Transmission des données ..
Révision 6 propagée.

Le travail est comité mais ceux qui utilise la branche n'est bénéficie pas. Zéro stress, le merge est l'arme fatale. Commencez par un update c'est mieux.

ioo@particules:~/test/work$ svn update
À la révision 6.

Votre cible est le dossier de la branche 1.0 de votre copie de travail et votre source le dossier trunk du repository On regarde la révision à laquelle est notre branche sur notre copie de travail grâce à la commande svn info

ioo@particules:~/test/work$ svn info branches/1.0/
Chemin : branches/1.0
URL : file:///home/ioo/test/rep/branches/1.0
Racine du dépôt : file:///home/ioo/test/rep
Révision : 6
Type de noeud : répertoire
Tâche programmée : normale
Auteur de la dernière modification : ioo
Révision de la dernière modification : 4
Date de la dernière modification: 2009-03-31 00:35:14 +0200 (mar, 31 mar 2009)

Ce qui nous intéresse ici c'est Révision de la dernière modification qui est 4 et non Révision 6 qui est la révision du repository..

Il faut donc prendre les fichiers du repository qui sont à la dernière version et les merger avec la branches[4]

ioo@particules:~/test/work$ svn merge -r 4:HEAD file:///home/ioo/test/rep/trunk/ branches/1.0/
A    branches/1.0/addons.txt
U    branches/1.0/framework.txt

L'option -r donne les numéros de révision, en premier la révision de la cible et le "HEAD" indique de prendre la dernière révision sur le répository. Vous pouvez indiquer un numéro de révision également. La suite de la commande est composée de la source et de la cible. Vous pouvez comitter les changement du dépot, effacer le trunk de votre copie de travail et du dépot également.

ioo@particules:~/test/work$ svn ci -m "merge du trunk et de la branche 1.0"
Ajout          branches/1.0/addons.txt
Envoi          branches/1.0/framework.txt
Transmission des données .
Révision 7 propagée.
ioo@particules:~/test/work$ svn delete trunk/
D         trunk/addons.txt
D         trunk/framework.txt
D         trunk
ioo@particules:~/test/work$ svn ci -m "suppression du trunk"
Suppression    trunk

Révision 8 propagée.

Et voilà un gros kamehameha sur votre trunk et votre repository est tout propre. Vous avez sauvé vos dev d'un passage en super sayan furax !

Notes

[1] du style django et mettez le post sur le planet d'un autre... ;-)

[2] et qu'en même temps vous soyez assez fou pour entretenir le tout :-P

[3] il aura évoluer entre temps, donc ne prenez pas un tags

[4] La phrase dans ce sens me permet de retenir la commande