Subversion un outil de gestion de version Florent
Subversion, un outil de gestion de version Florent Guilleux, Comité Réseau des Universités Tuto. JRES 01, Juin 2006
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) • … 2
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 3
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… 4
… qui justifient l’effort de prise en main commit diff merge BASE patch modules tag trunk version branches repository conflict update HEAD check out 5
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 6
À 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 7
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 8
Concepts et opérations de base Travailler à plusieurs avec Subversion Gérer les diffusions : étiquettes et branches Opérations avancées Divers 9
Un référentiel central et une copie de travail Référentiel trunk/ 1 svn checkout 2 svn commit 3 svn commit Copie de travail d’Alice alice$work > svn commit my. Project/file 1. pl alice$work > svn coalice$work http: //subversion. example. com/my. Project/trunk my. Project 10
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 (Java. Doc par exemple) 11
Récupérer n’importe quelle révision : svn checkout • Par un numéro de révision alice$work > svn co –r 2 http: //subversion. example. com/my. Project A my. Project/trunk/file 1. pl A my. Project/trunk/file 2. pl Checkout revision 2. • Par une date alice$work > svn co –r {2006 -01 -15} http: //subversion. example. com/my. Project A my. Project/trunk/file 1. pl A my. Project/trunk/file 2. pl Checkout revision 1. • Mettre à jour une copie locale : svn update alice$work > svn update my. Project U my. Project/file 1. pl U my. Project/file 2. pl Updated to revision 3. 12
Connaître l’origine de sa copie locale : svn info alice$work > svn info my. Project Path: my. Project URL: http: //subversion. example. com/my. Project/trunk Repository UUID: d 6959 e 13 -b 0 o 4 -0673 -7 u 654 -a 2 v 3 e 0 b 6 c 323 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
Les autres opérations sur le référentiel Référentiel trunk/ svn add, copy, delete, move 3 svn checkout 4 svn add svn commit Copie de travail d’Alice alice$work > svn delete http: //subversion. example. com/my. Project/trunk/file 2. pl alice$work > >svn my. Project/file 3. pl alice$work svncommit add my. Project/file 3. pl 14
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é 15
Connaître l’état de sa copie locale : svn status alice$work > svn status my. Project Référentiel M my. Project/file 1. pl 3 Dtrunk/+ my. Project/file 2. pl A + my. Project/file 4. pl ? my. Project/file 5. pl svn checkout !Copie de my. Project/file 3. pl travail d’Alice 1 svn delete 1 2 4 svn add 3 4 5 16
Les messages de journal (logs) • A chaque commit est associé un message de journal alice$work > svn commit –m ‘chgt de $regexp’ my. Project/file 1. pl • Le message doit indiquer pourquoi cette modification a été appliquée -m ‘Désormais on whitelist le format des paramètres CGI’ 17
Connaître l’historique des modifications : svn log alice$work > svn log my. Project/file 1. pl ---------------------------alice$work > svn log 16: 43: 22 –r 2 –v (Thu, my. Project/file 1. pl r 3 | Alice | 2006 -03 -09 9 Mar 2006) ---------------------------Ajout de la gestion des sessions r 2 | Alice | 2006 -02 -01 09: 34: 12 (Wed, 01 Feb 2006) ---------------------------Changed r 2 | Alice |paths: 2006 -02 -01 09: 34: 12 (Wed, 01 Feb 2006) M my. Project/file 1. pl Désormais on whitelist le format des paramètres CGI M my. Project/file 2. pl ---------------------------Désormais on whitelist 09: 34: 12 le format (Tue, des paramètres CGI r 1 | Alice | 2006 -01 -10 10 Jan 2006) ---------------------------Import initial 18
Connaître 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
HEAD, BASE, COMMITED, PREV Référentiel HEAD trunk/ 1 2 3 4 5 svn checkout Copie de travail d’Alice PREV COMMITED BASE alice$my. Project svn diff file 1. pl alice$my. Project > svn diff –r>PREV: COMMITED file 1. pl alice$my. Project > svn –r BASE: HEAD 20
svn diff permet de créer des patch dave$my. Project > svn diff file 1. pl > Dave. patch alice$my. Project > patch –p 0 -i Dave. patch 21
Annuler des modifications dans la copie de travail Référentiel 1 trunk/ 2 svn checkout Copie de travail d’Alice svn commit svn revert alice$work > svn revert my. Project/File 1. pl Reverted ‘File 1. pl’ 22
Annuler des modifications dans le référentiel Référentiel trunk/ 215 216 419 418 svn checkout svn commit svn merge –r 216: 215 File 1. pl svn logsvn File 1. pl ; svn diff –r 215: 216 23
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 24
Des conflits peuvent survenir Copie de travail de Bob Référentiel trunk/ svn checkout 1 svn checkout svn commit 2 svn commit Copie de travail d’Alice 25
Résolution des conflits Copie de travail de Bob Référentiel trunk/ svn checkout svn update svn commit 1 svn checkout 2 svn commit Copie de travail d’Alice bob$my. Project File 1. pl bob$my. Project > > svn commit update File 1. pl Sending File 1. pl G File 1. pl svn: commit failed (details follow): Updated to revision 2 svn: Out of date: ‘/my. Project/File 1. pl’ in transaction ‘ 4’ 26
Si les modifications concernent des lignes différentes État « mer. Ged » : G Bob Zéro Un Deux Trois Quatre Un Deux Trois QUATRE svn update Zéro Un Deux Trois QUATRE svn commit Zéro Un Deux Trois QUATRE Alice 27
Si les modifications concernent les mêmes lignes État « Conflict » : C Un Deux Trois Quatre Un Two Trois Quatre Un Dos Trois QUATRE svn update Un <<<<. mine Two ==== Dos >>>>. r 2 Deux Trois QUATRE • File 1. pl. mine • File 1. pl. r 2 • File 1. pl. r 1 28
Si les modifications concernent les mêmes lignes Un <<<<. mine Un Two ==== svn résolution Two Dos resolved manuelle Trois QUATRE >>>>. r 2 Trois QUATRE État « Conflict » : C Un Two Trois QUATRE svn commit Un Two Trois QUATRE 29
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
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 31
Une étiquette est un nom donné à une révision Référentiel trunk/ Étiquettes 215 … 345 REL-0. 9 … 418 … 482 REL-1. 1 a 32
Une étiquette est stockée comme une copie Référentiel trunk/ 215 tags/REL-0. 9 … 345 … 418 … 482 346 tags/REL-1. 1 a 483 svn copy –r 345 http: //subversion. example. com/my. Project/trunk svn export http: //subversion. example. com/my. Project/tags/REL-0. 9 svn mkdir http: //subversion. example. com/my. Project/tags/REL-O. 9 33
Exemple de diffusion d’une release 1. Utiliser la commande svn export (pas de méta données) svn export http: //subversion. example. com/my. Project/tags/REL-0. 9 my. Project 2. Faire un tar. gz du répertoire my. Project 3. Le publier (web, FTP, etc. ) 34
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 35
Une branche est une autre ligne de développement Branche de correction de bogue BUG-2561 RB-O. 8 Branche de diffusion trunk Ligne principale TRY-new_cache Branche d’expérimentation 36
Une branche est stockée comme une copie Référentiel trunk/ branches/RB-0. 8 tags/ REL-0. 8 215 345 … 216 418 … 217 … … 482 314 315 svnco copy http: //subversion. example. com/my. Project/trunk svn copy http: //subversion. example. com/my. Project/branches/RB-O. 8 svn http: //subversion. example. com/my. Project/branches/RB-0. 8 http: //subversion. example. com/my. Project/tags/REL-0. 8 37
Le quotidien du subversif Camembert non contractuel 38
Propager la correction d’un bogue simple 1. Faire un checkout de la branche où le bogue a été détecté svn co http: //subversion. example/my. Project/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/my. Project/trunk 5. Y fusionner le correctif svn merge -r 219: 220 http: //subversion. example/my. Project/branches/RB-O. 8 6. Appliquer le résultat dans le référentiel avec svn commit 39
Propager la correction d’un bogue complexe 1. 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/my. Project/tags/PRE-865 http: //subversion. example/my. Project/tags/POST-865 7. Faire le commit pour appliquer la correction dans la branche 40
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 41
Partage de code entre plusieurs projets
Un référentiel peut inclure du code d’un autre référentiel serveur Subversion common/ my. Project/ trunk/ doc/ src/ lib/ common/ svn: externals doc/ lib/ 50
Les scripts associés
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 53
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 • … 54
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 58
Les clients et plugins Subversion • Windows : Tortoise. SVN • Multi plateformes : Rapid. SVN, QSvn, Subcommander • Eclipse : Subclipse, Subversive (beta) • Visual Studio : Ankh. SVN • Emacs : psvn. el 59
Outils de navigation et API • Outils de navigation – SVN: : Web – View. VC – Web. SVN • API – C, C++, Python, JAVA, Perl, Ruby, C#, PHP • Installation ultra simplifiée pour Windows – SVN 1 -Click Setup 60
Les protocoles d’accès à Subversion • svn: // • svn+ssh: // • https: // • file: // 61
Conclusion 62
Un outil puissant et efficace • CVS sans les défauts • Fiable et performant • Excellentes documentations • Modèle centralisé simple à appréhender 63
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) 64
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) 65
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 66
- Slides: 55