Anda di halaman 1dari 55

Subversion, un outil de gestion de version

Florent Guilleux, Comit Rseau des Universits TutoJRES 01, Juin 2006

Le dveloppement de logiciel est une tche complexe Mode de dveloppement ouvert :


contributeurs extrieurs relations distance (mail, IRC, etc.)

Gestion des diffusions (releases, correctifs de scurit, etc.) Dpendances multiples (bibliothques)
2 / 66

De nombreux outils laide du dveloppeur


Les IDE Lautomatisation de tests

Les gestionnaires de bogues, de demandes de fonctionnalits


Les gnrateurs de documentation

Les systmes de gestion de version


3 / 66

Le versionning apporte de nombreux gains


Retours en arrire et corrections toujours possibles

Historique de toutes les oprations


Indispensable pour le travail en quipe Travaux en parallle sur plusieurs branches Pour du code mais aussi un site web, de la doc
4 / 66

qui justifient leffort de prise en main commit


diff patch modules tag trunk

version

merge
BASE

branches
update HEAD

repository

conflict

check out
5 / 66

Subversion est un outil fiable et puissant


CVS sans les dfauts + de nouvelles fonctionnalits

Prise en main aise, excellentes documentations


Open source, disponible sur de nombreuses plate formes prouv et fiable
6 / 66

qui profite la Subversion ?


Pour les dveloppeurs
utilisation complte

Pour les utilisateurs avancs (ou impatients) du produit


export, rcupration de patchs

Pour les utilisateurs finaux du produit


pas dutilisation de Subversion
7 / 66

Pour les utilisateurs de CVS


les commits sont atomiques les numros de rvision sont diffrents

les rpertoires et mta donnes sont versionns


une vraie commande move status, diff et revert sont des oprations dconnectes http://svnbook.red-bean.com/en/1.0/apa.html
8 / 66

Concepts et oprations de base Travailler plusieurs avec Subversion


Grer les diffusions : tiquettes et branches Oprations avances Divers

Un rfrentiel central et une copie de travail


Rfrentiel

trunk/

svn checkout

svn commit

svn commit

Copie de travail dAlice


alice$work > svn commit myProject alice$work > svn commit myProject/file1.pl alice$work > svn co http://subversion.example.com/myProject/trunk myProject
10 / 66

Que faut-il enregistrer dans un rfrentiel ?


tout ce qui peut est susceptible de changer au cours du temps
le code

+ ce qui sert au dploiement de lappli (scripts dinstallation par exemple) la documentation du produit

sauf ce qui peut tre gnr automatiquement (JavaDoc par exemple)


11 / 66

Rcuprer nimporte quelle rvision : svn checkout


Par un numro de rvision
alice$work > svn co r 2 http://subversion.example.com/myProject myProject
A myProject/trunk/file1.pl A myProject/trunk/file2.pl Checkout revision 2.

Par une date


alice$work > svn co r {2006-01-15} http://subversion.example.com/myProject
A myProject/trunk/file1.pl A myProject/trunk/file2.pl Checkout revision 1.

Mettre jour une copie locale : svn update


alice$work > svn update myProject
U myProject/file1.pl U myProject/file2.pl Updated to revision 3.

12 / 66

Connatre lorigine de sa copie locale : svn info

alice$work > svn info myProject


Path: myProject URL: http://subversion.example.com/myProject/trunk Repository UUID: d6959e13-b0o4-0673-7u654-a2v3e0b6c323 Revision: 2 Node Kind: directory Schedule: normal Last Changed Author: alice Last Changed Rev: 2 Last Changed Date: 2006-02-14 12:07:15 []

13 / 66

Les autres oprations sur le rfrentiel


Rfrentiel

svn add, copy, delete, move


3 4

trunk/

svn checkout

svn add

svn commit

Copie de travail dAlice

alice$work > svn delete http://subversion.example.com/myProject/trunk/file2.pl alice$work >> svn commit myProject/file3.pl alice$work svn add myProject/file3.pl
14 / 66

Quand faut-il faire des commit ?


Souvent Aprs avoir test et valid ses modifications
En groupant dans un commit les modifications qui correspondent une mme fonctionnalit
15 / 66

Connatre ltat de sa copie locale : svn status


Rfrentiel

alice$work > svn status myProject


M myProject/file1.pl 3 D + myProject/file2.pl trunk/ A + myProject/file4.pl ? myProject/file5.pl svn checkout !Copie de myProject/file3.pl
travail dAlice
1 1 4

svn delete

svn add
3

4 5

16 / 66

Les messages de journal (logs)


A chaque commit est associ un message de journal
alice$work > svn commit m chgt de $regexp myProject/file1.pl

Le message doit indiquer pourquoi cette modification a t applique


-m Dsormais on whitelist le format des paramtres CGI
17 / 66

Connatre lhistorique des modifications : svn log

alice$work > svn log myProject/file1.pl


-----------------------------------------------------alice$work > svn log r 2 v (Thu, myProject/file1.pl r3 | Alice | 2006-03-09 16:43:22 9 Mar 2006) -----------------------------------------------------Ajout de la gestion des sessions r2 | Alice | 2006-02-01 09:34:12 (Wed, 01 Feb 2006) -----------------------------------------------------Changed r2 | Alice |paths: 2006-02-01 09:34:12 (Wed, 01 Feb 2006) M myProject/file1.pl Dsormais on whitelist le format des paramtres CGI M myProject/file2.pl -----------------------------------------------------Dsormais on whitelist09:34:12 le format(Tue, des paramtres CGI r1 | Alice | 2006-01-10 10 Jan 2006) -----------------------------------------------------Import initial

18 / 66

Connatre les modifications : svn diff


Email Jean jean@example.com
Contacts.txt 1

Adresses Jean jean@example.com David david@example.com


Contacts.txt (copie de travail)

svn diff Contacts.txt


Index: Contacts.txt ================ --- Contacts.txt (revision 1) +++ Contacts.txt (working copy) @@ -1,2 +1,3 @@ - Email + Adresses Jean jean@example.com + David david@example.com
19 / 66

HEAD, BASE, COMMITED, PREV


Rfrentiel
HEAD

trunk/

svn checkout

Copie de travail dAlice

PREV

COMMITED

BASE

alice$myProject svn diff file1.pl file1.pl alice$myProject > svn diff diff r>PREV:COMMITED file1.pl alice$myProject > svn r BASE:HEAD
20 / 66

svn diff permet de crer des patch

dave$myProject > svn diff file1.pl > Dave.patch

alice$myProject > patch p0 -i Dave.patch

21 / 66

Annuler des modifications dans la copie de travail


Rfrentiel

trunk/

svn checkout

svn commit

Copie de travail dAlice


alice$work > svn revert myProject/File1.pl
Reverted File1.pl

svn revert

22 / 66

Annuler des modifications dans le rfrentiel


Rfrentiel

trunk/

215

216

418

419

svn checkout

svn commit

svn merge

merge r216:215 File1.plFile1.pl svn logsvn File1.pl ; svn diff r 215:216


23 / 66

Concepts et oprations de base Travailler plusieurs sur un rfrentiel


Grer les diffusions : tiquettes et branches Oprations avances Divers

Des conflits peuvent survenir


Copie de travail de Bob Rfrentiel trunk/
svn checkout
svn commit

svn checkout

svn commit

Copie de travail dAlice


25 / 66

Rsolution des conflits


Copie de travail de Bob Rfrentiel trunk/
svn checkout svn update svn commit

Copie de travail dAlice bob$myProject File1.pl bob$myProject > > svn svn commit update File1.pl

svn checkout

svn commit

Sending File1.pl G File1.pl svn: commit failed (details follow): Updated to revision 2 svn: Out of date: /myProject/File1.pl in transaction 4

26 / 66

Si les modifications concernent des lignes diffrentes


Bob
Zro Un Deux Trois Quatre tat merGed : G Zro Un Deux Trois QUATRE

svn update

svn commit
Zro Un Deux Trois QUATRE

Un Deux Trois Quatre

Un Deux Trois QUATRE


Alice

27 / 66

Si les modifications concernent les mmes lignes


tat Conflict : C
Un <<<< .mine Two ==== Dos >>>> .r2 Deux Trois QUATRE
File1.pl

Un Deux Trois Quatre

Un Two Trois Quatre

svn update

Un Dos Trois QUATRE

File1.pl.mine
File1.pl.r2 File1.pl.r1
28 / 66

Si les modifications concernent les mmes lignes


Un <<<< .mine Un Two ==== svn rsolution Two Dos resolved manuelle Trois QUATRE >>>> .r2 Trois QUATRE tat Conflict : C

Un Two Trois QUATRE svn commit Un Two Trois QUATRE


29 / 66

Cycle de travail typique


1. Mettre jour sa copie de travail svn update

5. Enregistrer ses modifications svn commit


2. Apporter des modifications svn add / copy / delete / move 4. Fusionner les modifications svn merge / resolved 3. Visualiser les modifications svn status (-u) / diff / revert
30 / 66

Concepts et oprations de base Travailler plusieurs sur un rfrentiel


Grer les diffusions : tiquettes et branches Oprations avances Divers

Une tiquette est un nom donn une rvision


Rfrentiel

trunk/

215

345

418

482

tiquettes

REL-0.9

REL-1.1a

32 / 66

Une tiquette est stocke comme une copie


Rfrentiel trunk/
215

345

418

482

tags/REL-0.9 tags/

346

tags/REL-1.1a

483

svn copy r 345 http://subversion.example.com/myProject/trunk svn export http://subversion.example.com/myProject/tags/REL-0.9 svn mkdir http://subversion.example.com/myProject/tags http://subversion.example.com/myProject/tags/REL-O.9
33 / 66

Exemple de diffusion dune release


1. Utiliser la commande svn export (pas de mta donnes)
svn export http://subversion.example.com/myProject/tags/REL-0.9 myProject

2. Faire un tar.gz du rpertoire myProject

3. Le publier (web, FTP, etc.)


34 / 66

Empcher les commit dans tags


souvent inutile, convention entre les dveloppeurs

si ncessaire utiliser un script associ parfois des exceptions, par exemple une tiquette latest-build

35 / 66

Une branche est une autre ligne de dveloppement


Branche de correction de bogue BUG-2561

RB-O.8 Branche de diffusion trunk Ligne principale

TRY-new_cache
Branche dexprimentation
36 / 66

Une branche est stocke comme une copie


Rfrentiel

trunk/

215

345

418

482

branches/RB-0.8

216

217

314

tags/ REL-0.8

315

svn copy http://subversion.example.com/myProject/trunk svn copy http://subversion.example.com/myProject/branches/RB-O.8 svn co http://subversion.example.com/myProject/branches/RB-0.8 http://subversion.example.com/myProject/branches/RB-0.8 http://subversion.example.com/myProject/tags/REL-0.8
37 / 66

Le quotidien du subversif
ajout de fonctionnalits correction de bug, application dans les branches prparation de release fusion de branches

Camembert non contractuel


38 / 66

Propager la correction dun bogue simple


1. Faire un checkout de la branche o le bogue a t dtect svn co http://subversion.example/myProject/branches/RB-0.8
[] Checked out revision 219

2. Corriger le bogue, tester le correctif 3. Enregistrer la correction dans le rfrentiel svn commit m correction du bogue #735
[] Committed revision 220

4. Faire un checkout de la branche o appliquer le correctif svn co http://subversion.example/myProject/trunk 5. Y fusionner le correctif


svn merge -r 219:220 http://subversion.example/myProject/branches/RB-O.8

6. Appliquer le rsultat dans le rfrentiel avec svn commit


39 / 66

Propager la correction dun bogue complexe


1. Crer une branche de correction de bug BUG-865
2. Crer une tiquette partir de cette nouvelle branche, PRE-865. 3. Corriger le bug dans BUG-865. Plusieurs commit sont possibles. 4. Quand le bug est corrig dans BUG-865, crer une tiquette POST-865.

5. Faire un checkout (ou update) de la branche corriger


6. Utiliser PRE-865 et POST-865 pour fusionner le correctif dans la branche corriger :
svn merge http://subversion.example/myProject/tags/PRE-865 http://subversion.example/myProject/tags/POST-865

7. Faire le commit pour appliquer la correction dans la branche


40 / 66

Concepts et oprations de base Travailler plusieurs sur un rfrentiel


Grer les diffusions : tiquettes et branches Oprations avances Divers

Partage de code entre plusieurs projets

Un rfrentiel peut inclure du code dun autre rfrentiel

serveur Subversion common/


trunk/
doc/
lib/

myProject/
trunk/
doc/ src/

common/
svn:externals doc/ lib/
50 / 66

Les scripts associs

Un script associ est une action lie un vnement enrichit le comportement de Subversion

dclenchable lors dune action sur le rfrentiel


avant, pendant ou aprs un commit

configur au niveau du serveur Subversion

53 / 66

Exemples de scripts associs


envoi dun email de notification aprs chaque commit interdire les messages de journaux vides obliger mentionner un numro de bogue pour les messages de journaux dune certaine branche enrichir les rgles de contrle daccs dclencher une copie de sauvegarde du rfrentiel aprs chaque commit permettre la modification dun message de journal sauvegarder les valeurs des proprits non versionnes
54 / 66

Concepts et oprations de base Travailler plusieurs sur un rfrentiel


Grer les diffusions : tiquettes et branches Oprations avances Divers

Les clients et plugins Subversion


Windows : TortoiseSVN
Multi plateformes : RapidSVN, QSvn, Subcommander Eclipse : Subclipse, Subversive (beta) Visual Studio : AnkhSVN Emacs : psvn.el
59 / 66

Outils de navigation et API


Outils de navigation
SVN::Web ViewVC WebSVN

API
C, C++, Python, JAVA, Perl, Ruby, C#, PHP

Installation ultra simplifie pour Windows


SVN 1-Click Setup
60 / 66

Les protocoles daccs Subversion


svn://
svn+ssh:// http://

https://
file://
61 / 66

Conclusion

Un outil puissant et efficace


CVS sans les dfauts

Fiable et performant Excellentes documentations


Modle centralis simple apprhender

63 / 66

Mais des limites inhrentes au modle centralis


Seuls des utilisateurs privilgis peuvent crire dans le rfrentiel Besoin dun accs rseau pour nombre doprations Une scission du projet est forcment binaire Une alternative : les VCS dcentraliss (voir http://2005.jres.org/paper/2.pdf)

64 / 66

Rfrences
Site : http://subversion.tigris.org,
Doc officielle : http://svnbook.red-bean.com Gestion de projet avec Subversion (OReilly) Pragmatic Version Control (Pragmatic Bookshelf)

65 / 66

Traduction des termes


branche = branche copie de travail = working copy dpt = repository tiquette = tag message de journal = log proprit = property rfrentiel = repository rvision = revision script associ = hook
66 / 66