Subversion, un outil de gestion de version
Florent Guilleux, Comité Réseau des Universités
TutoJRES 01, Juin 2006
2 / 66
Le développement de logiciel est une tâche complexe
• Mode de développement ouvert :– contributeurs extérieurs– relations à distance (mail, IRC, etc.)
• Gestion des diffusions (releases, correctifs de sécurité, etc.)
• Dépendances multiples (bibliothèques)
• …
3 / 66
De nombreux outils à l’aide du développeur
• Les IDE
• L’automatisation de tests
• Les gestionnaires de bogues, de demandes de fonctionnalités
• Les générateurs de documentation
• Les systèmes de gestion de version
4 / 66
Le versionning apporte de nombreux gains
• Retours en arrière et corrections toujours possibles
• Historique de toutes les opérations
• Indispensable pour le travail en équipe
• Travaux en parallèle sur plusieurs branches
• Pour du code mais aussi un site web, de la doc…
5 / 66
… qui justifient l’effort de prise en main
commit
tag branches
repository
HEAD
BASEupdate
version
check out
modules
merge
conflict
diff
patchtrunk
6 / 66
Subversion est un outil fiable et puissant
• CVS sans les défauts + de nouvelles fonctionnalités
• Prise en main aisée, excellentes documentations
• Open source, disponible sur de nombreuses plate formes
• Éprouvé et fiable
7 / 66
À qui profite la Subversion ?
• Pour les développeurs– utilisation complète
• Pour les utilisateurs « avancés » (ou impatients) du produit– export, récupération de patchs
• Pour les utilisateurs finaux du produit– pas d’utilisation de Subversion
8 / 66
Pour les utilisateurs de CVS• les commits sont atomiques
• les numéros de révision sont différents
• les répertoires et méta données sont versionnés
• une vraie commande move
• status, diff et revert sont des opérations déconnectées
• …
http://svnbook.red-bean.com/en/1.0/apa.html
Concepts et opérations de base
Travailler à plusieurs avec Subversion
Gérer les diffusions : étiquettes et branches
Opérations avancées
Divers
10 / 66
Un référentiel central et une copie de travail
Référentiel
Copie de travail d’Alice
svn checkout svn commit svn commit
1 2 3
alice$work > svn co http://subversion.example.com/myProject/trunk myProjectalice$work > svn commit myProjectalice$work > svn commit myProject/file1.pl
trunk/
11 / 66
Que faut-il enregistrer dans un référentiel ?
• tout ce qui peut est susceptible de changer au cours du temps– le code
– + ce qui sert au déploiement de l’appli (scripts d’installation par exemple)
– la documentation du produit
• sauf ce qui peut être généré automatiquement (JavaDoc par exemple)
12 / 66
Récupérer n’importe quelle révision : svn checkout
alice$work > svn co –r 2 http://subversion.example.com/myProject myProjectA myProject/trunk/file1.plA myProject/trunk/file2.plCheckout revision 2.
• Par un numéro de révision
alice$work > svn co –r {2006-01-15} http://subversion.example.com/myProjectA myProject/trunk/file1.plA myProject/trunk/file2.plCheckout revision 1.
• Par une date
• Mettre à jour une copie locale : svn updatealice$work > svn update myProjectU myProject/file1.plU myProject/file2.plUpdated to revision 3.
13 / 66
Connaître l’origine de sa copie locale : svn info
alice$work > svn info myProjectPath: myProjectURL: http://subversion.example.com/myProject/trunkRepository UUID: d6959e13-b0o4-0673-7u654-a2v3e0b6c323Revision: 2Node Kind: directorySchedule: normalLast Changed Author: aliceLast Changed Rev: 2Last Changed Date: 2006-02-14 12:07:15 […]
14 / 66
Les autres opérations sur le référentiel
svn add, copy, delete, moveRéférentiel
Copie de travail d’Alice
svn checkout svn addsvn commit
3 4
alice$work > svn add myProject/file3.plalice$work > svn commit myProject/file3.plalice$work > svn delete http://subversion.example.com/myProject/trunk/file2.pl
trunk/
15 / 66
Quand faut-il faire des commit ?
• Souvent
• Après avoir testé et validé ses modifications
• En groupant dans un commit les modifications qui correspondent à une même fonctionnalité
16 / 66
Connaître l’état de sa copie locale : svn statusRéférentiel
3
Copie de travail d’Alice
svn checkout
1
2
3
trunk/
svn delete svn add
4
1
4
5
alice$work > svn status myProjectM myProject/file1.plD + myProject/file2.plA + myProject/file4.pl? myProject/file5.pl! myProject/file3.pl
17 / 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é appliquée
-m ‘Désormais on whitelist le format des paramètres CGI’
18 / 66
Connaître l’historique des modifications : svn log
alice$work > svn log myProject/file1.pl------------------------------------------------------r3 | Alice | 2006-03-09 16:43:22 (Thu, 9 Mar 2006)Ajout de la gestion des sessions------------------------------------------------------r2 | Alice | 2006-02-01 09:34:12 (Wed, 01 Feb 2006)Désormais on whitelist le format des paramètres CGI------------------------------------------------------r1 | Alice | 2006-01-10 09:34:12 (Tue, 10 Jan 2006)Import initial
alice$work > svn log –r 2 –v myProject/file1.pl------------------------------------------------------r2 | Alice | 2006-02-01 09:34:12 (Wed, 01 Feb 2006)Changed paths:
M myProject/file1.plM myProject/file2.pl
Désormais on whitelist le format des paramètres CGI------------------------------------------------------
19 / 66
Connaître les modifications : svn diff
EmailJean [email protected]
AdressesJean [email protected] [email protected]
Contacts.txt Contacts.txt (copie de travail)1
svn diff Contacts.txtIndex: Contacts.txt================--- Contacts.txt (revision 1)+++ Contacts.txt (working copy)@@ -1,2 +1,3 @@- Email+ Adresses Jean [email protected]+ David [email protected]
20 / 66
HEAD, BASE, COMMITED, PREVRéférentiel
Copie de travail d’Alice
svn checkout
1 2 3 4
HEAD
5
BASE
alice$myProject > svn diff file1.pl
PREV COMMITED
alice$myProject > svn diff –r BASE:HEAD file1.plalice$myProject > svn diff –r PREV:COMMITED file1.pl
trunk/
21 / 66
svn diff permet de créer des patch
dave$myProject > svn diff file1.pl > Dave.patch
alice$myProject > patch –p0 -i Dave.patch
22 / 66
Annuler des modifications dans la copie de travail
Référentiel
Copie de travail d’Alice
svn checkout svn commit
1 2
alice$work > svn revert myProject/File1.plReverted ‘File1.pl’
trunk/
svn revert
23 / 66
svn log File1.pl ; svn diff –r 215:216 File1.pl
Annuler des modifications dans le référentiel
Référentiel
215 216 418trunk/
svn checkout
419
svn commit
svn merge
svn merge –r216:215 File1.pl
Concepts et opérations de base
Travailler à plusieurs sur un référentiel
Gérer les diffusions : étiquettes et branches
Opérations avancées
Divers
25 / 66
Des conflits peuvent survenir
Référentiel
svn checkout svn commit
1 2
Copie de travail d’Alice
Copie de travail de
Bobsvn checkout svn commit
trunk/
26 / 66
Résolution des conflits
Référentiel
svn checkout svn commit
1 2
Copie de travail d’Alice
Copie de travail de
Bobsvn checkout
svn commit
bob$myProject > svn commit File1.plSending File1.plsvn: commit failed (details follow):svn: Out of date: ‘/myProject/File1.pl’ in transaction ‘4’
svn update
bob$myProject > svn update File1.plG File1.plUpdated to revision 2
trunk/
27 / 66
Si les modifications concernent des lignes différentes
UnDeuxTroisQuatre
ZéroUnDeuxTroisQuatre
UnDeuxTroisQUATRE
ZéroUnDeuxTroisQUATRE
svn update
État « merGed » : G
ZéroUnDeuxTroisQUATRE
svn commit
Bob
Alice
28 / 66
Si les modifications concernent les mêmes lignes
UnDeuxTroisQuatre
UnTwoTroisQuatre
UnDosTroisQUATRE
Un<<<< .mineTwo====Dos>>>> .r2DeuxTroisQUATRE
svn update
État « Conflict » : C
• File1.pl
• File1.pl.mine
• File1.pl.r2
• File1.pl.r1
29 / 66
Si les modifications concernent les mêmes lignes
Un<<<< .mineTwo====Dos>>>> .r2TroisQUATRE
État « Conflict » : C
UnTwoTroisQUATRE
résolution manuelle
UnTwoTroisQUATRE
svn resolved
UnTwoTroisQUATRE
svn commit
30 / 66
Cycle de travail typique1. Mettre à jour sa copie de travail
svn update
2. Apporter des modificationssvn add / copy / delete /
move
3. Visualiser les modificationssvn status (-u) / diff / revert
4. Fusionner les modifications svn merge / resolved
5. Enregistrer ses modificationssvn commit
Concepts et opérations de base
Travailler à plusieurs sur un référentiel
Gérer les diffusions : étiquettes et branches
Opérations avancées
Divers
32 / 66
Une étiquette est un nom donné à une révision
Référentiel
215 345 418… … …482
Étiquettes REL-0.9 REL-1.1a
trunk/
33 / 66
Une étiquette est stockée comme une copie
Référentiel
215 345 418… … …482
svn mkdir http://subversion.example.com/myProject/tags
trunk/
tags/
tags/REL-0.9
tags/REL-1.1a
346
483
svn copy –r 345 http://subversion.example.com/myProject/trunk http://subversion.example.com/myProject/tags/REL-O.9svn export http://subversion.example.com/myProject/tags/REL-0.9
34 / 66
Exemple de diffusion d’une release
svn export http://subversion.example.com/myProject/tags/REL-0.9 myProject
1. Utiliser la commande svn export (pas de méta données)
2. Faire un tar.gz du répertoire myProject
3. Le publier (web, FTP, etc.)
35 / 66
Empêcher les commit dans tags
• souvent inutile, convention entre les développeurs
• si nécessaire utiliser un « script associé »
• parfois des exceptions, par exemple une étiquette latest-build
36 / 66
BUG-2561
Une branche est une autre ligne de développement
trunk
RB-O.8
Ligne principale
Branche d’expérimentation
Branche de diffusion
Branche de correction de bogue
TRY-new_cache
37 / 66
Une branche est stockée comme une copieRéférentiel
215 345 418… … …482trunk/
tags/
branches/ 216 217 … 314
315
svn copy http://subversion.example.com/myProject/trunk http://subversion.example.com/myProject/branches/RB-0.8
svn co http://subversion.example.com/myProject/branches/RB-0.8
RB-0.8
REL-0.8
svn copy http://subversion.example.com/myProject/branches/RB-O.8 http://subversion.example.com/myProject/tags/REL-0.8
38 / 66
Le quotidien du subversif
Camembert non contractuel
ajout defonctionnalités
correction de bug,application dans lesbranches
préparation derelease
fusion de branches
39 / 66
Propager la correction d’un bogue simple1. Faire un checkout de la branche où le bogue a été détecté
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 référentiel
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 résultat dans le référentiel avec svn commit
40 / 66
Propager la correction d’un bogue complexe1. Créer une branche de correction de bug BUG-865
2. Créer 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, créer 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
Concepts et opérations de base
Travailler à plusieurs sur un référentiel
Gérer les diffusions : étiquettes et branches
Opérations avancées
Divers
Partage de code entre plusieurs projets
50 / 66
Un référentiel peut inclure du code d’un autre référentiel
serveur Subversion
myProject/
trunk/
doc/
src/
common/
common/
trunk/
doc/
lib/
doc/
lib/
svn:externals
Les scripts associés
53 / 66
Un script associé est une action liée à un évènement
• enrichit le comportement de Subversion
• déclenchable lors d’une action sur le référentiel– avant, pendant ou après un commit
• configuré au niveau du serveur Subversion
54 / 66
Exemples de scripts associés• envoi d’un email de notification après chaque commit• interdire les messages de journaux vides• obliger à mentionner un numéro de bogue pour les
messages de journaux d’une certaine branche• enrichir les règles de contrôle d’accès• déclencher une copie de sauvegarde du référentiel
après chaque commit• permettre la modification d’un message de journal• sauvegarder les valeurs des propriétés non
versionnées• …
Concepts et opérations de base
Travailler à plusieurs sur un référentiel
Gérer les diffusions : étiquettes et branches
Opérations avancées
Divers
59 / 66
Les clients et plugins Subversion
• Windows : TortoiseSVN
• Multi plateformes : RapidSVN, QSvn, Subcommander
• Eclipse : Subclipse, Subversive (beta)
• Visual Studio : AnkhSVN
• Emacs : psvn.el
60 / 66
Outils de navigation et API
• Outils de navigation– SVN::Web– ViewVC– WebSVN
• API– C, C++, Python, JAVA, Perl, Ruby, C#, PHP
• Installation ultra simplifiée pour Windows– SVN 1-Click Setup
61 / 66
Les protocoles d’accès à Subversion
• svn://
• svn+ssh://
• http://
• https://
• file://
Conclusion
63 / 66
Un outil puissant et efficace
• CVS sans les défauts
• Fiable et performant
• Excellentes documentations
• Modèle centralisé simple à appréhender
64 / 66
Mais des limites inhérentes au modèle centralisé
• Seuls des utilisateurs privilégiés peuvent écrire dans le référentiel
• Besoin d’un accès réseau pour nombre d’opérations
• Une scission du projet est forcément binaire
• Une alternative : les VCS décentralisés (voir http://2005.jres.org/paper/2.pdf)
65 / 66
Références
• Site : http://subversion.tigris.org,
• Doc officielle : http://svnbook.red-bean.com
• Gestion de projet avec Subversion (O’Reilly)
• Pragmatic Version Control (Pragmatic Bookshelf)
66 / 66
Traduction des termes
• branche = branche
• copie de travail = working copy
• dépôt = repository
• étiquette = tag
• message de journal = log
• propriété = property
• référentiel = repository
• révision = revision
• script associé = hook