560 likes | 731 Views
Subversion, un outil de gestion de version. Florent Guilleux, Comité Réseau des Universités TutoJRES 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.)
E N D
Subversion, un outil de gestion de version Florent Guilleux, Comité Réseau des Universités TutoJRES 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) • …
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
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…
… qui justifient l’effort de prise en main trunk patch version commit modules diff tag merge branches BASE repository update HEAD conflict check out
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
À 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
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
Un référentiel central et une copie de travail Référentiel trunk/ 1 3 2 svn checkout svn commit svn commit Copie de travail d’Alice alice$work > svn commit myProject alice$work > svn commit myProject/file1.pl alice$work > svn co http://subversion.example.com/myProject/trunk myProject
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)
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/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.
Connaître l’origine 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 […]
Les autres opérations sur le référentiel svn add, copy, delete, move Référentiel trunk/ 3 4 svn checkout svn add svn commit Copie de travail d’Alice 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
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é
Connaître l’état de sa copie locale : svn status svn checkout Copie de travail d’Alice 1 1 2 3 4 5 alice$work > svn status myProject M myProject/file1.pl D + myProject/file2.pl A + myProject/file4.pl ? myProject/file5.pl ! myProject/file3.pl Référentiel 3 trunk/ svn delete 4 svn add
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’
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.pl M myProject/file2.pl Désormais on whitelist le format des paramètres CGI ------------------------------------------------------
Connaître les modifications : svn diff Adresses Jean jean@example.com David david@example.com Email Jean jean@example.com Contacts.txt Contacts.txt (copie de travail) 1 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
HEAD, BASE, COMMITED, PREV PREV COMMITED Référentiel HEAD trunk/ 1 3 4 2 5 svn checkout Copie de travail d’Alice BASE alice$myProject > svn diff file1.pl alice$myProject > svn diff –r PREV:COMMITED file1.pl alice$myProject > svn diff –r BASE:HEAD file1.pl
svn diff permet de créer des patch dave$myProject > svn diff file1.pl > Dave.patch alice$myProject > patch –p0 -i Dave.patch
Annuler des modifications dans la copie de travail svn revert Référentiel trunk/ 1 2 svn checkout svn commit Copie de travail d’Alice alice$work > svn revert myProject/File1.pl Reverted ‘File1.pl’
Annuler des modifications dans le référentiel 419 svn commit svn checkout Référentiel trunk/ 216 418 215 svn merge svn merge –r216:215 File1.pl svn log File1.pl ; svn diff –r 215:216 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
Des conflits peuvent survenir 2 Copie de travail de Bob svn commit svn checkout Référentiel trunk/ 1 svn checkout svn commit Copie de travail d’Alice
Résolution des conflits Copie de travail de Bob svn update svn commit svn checkout Référentiel trunk/ 1 2 svn commit svn checkout Copie de travail d’Alice bob$myProject > svn update File1.pl G File1.pl Updated to revision 2 bob$myProject > svn commit File1.pl Sending File1.pl svn: commit failed (details follow): svn: Out of date: ‘/myProject/File1.pl’ in transaction ‘4’
Si les modifications concernent des lignes différentes État « merGed » : G Bob Zéro Un Deux Trois QUATRE Zéro Un Deux Trois Quatre svn commit svn update Zéro Un Deux Trois QUATRE Un Deux Trois Quatre Un Deux Trois QUATRE Alice
Si les modifications concernent les mêmes lignes État « Conflict » : C Un <<<< .mine Two ==== Dos >>>> .r2 Deux Trois QUATRE Un Two Trois Quatre svn update Un Deux Trois Quatre Un Dos Trois QUATRE • File1.pl • File1.pl.mine • File1.pl.r2 • File1.pl.r1
Si les modifications concernent les mêmes lignes Un <<<< .mine Two ==== Dos >>>> .r2 Trois QUATRE Un Two Trois QUATRE Un Two Trois QUATRE svn resolved résolution manuelle svn commit Un Two Trois QUATRE État « Conflict » : C
Cycle de travail typique • 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 • 1. Mettre à jour sa copie de travail • svn update
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
Une étiquette est un nom donné à une révision REL-0.9 Référentiel 482 418 345 trunk/ 215 … … … REL-1.1a Étiquettes
Une étiquette est stockée comme une copie Référentiel 482 trunk/ 418 345 215 … … … tags/REL-0.9 346 tags/ 483 tags/REL-1.1a svn copy –r 345 http://subversion.example.com/myProject/trunk http://subversion.example.com/myProject/tags/REL-O.9 svn export http://subversion.example.com/myProject/tags/REL-0.9 svn mkdir http://subversion.example.com/myProject/tags
Exemple de diffusion d’une release 1. Utiliser la commande svn export(pas de méta données) svn export http://subversion.example.com/myProject/tags/REL-0.9 myProject 2. Faire un tar.gz du répertoire myProject 3. Le publier (web, FTP, etc.)
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
Une branche est une autre ligne de développement BUG-2561 RB-O.8 TRY-new_cache Branche de correction de bogue Branche de diffusion trunk Ligne principale Branche d’expérimentation
Une branche est stockée comme une copie Référentiel 482 418 trunk/ 345 215 … … … … 217 216 314 branches/ RB-0.8 315 REL-0.8 tags/ svn copy http://subversion.example.com/myProject/trunk http://subversion.example.com/myProject/branches/RB-0.8 svn copy http://subversion.example.com/myProject/branches/RB-O.8 http://subversion.example.com/myProject/tags/REL-0.8 svn co http://subversion.example.com/myProject/branches/RB-0.8
Le quotidien du subversif Camembert non contractuel
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/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
Propager la correction d’un bogue complexe • Créer une branche de correction de bug BUG-865 • Créer une étiquette à partir de cette nouvelle branche, PRE-865. • Corriger le bug dans BUG-865. Plusieurs commit sont possibles. • Quand le bug est corrigé dans BUG-865, créer une étiquette POST-865. • Faire un checkout (ou update) de la branche à corriger • 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
Un référentiel peut inclure du code d’un autre référentiel doc/ svn:externals lib/ serveur Subversion common/ myProject/ trunk/ trunk/ doc/ doc/ src/ lib/ common/
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
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
Les clients et plugins Subversion • Windows : TortoiseSVN • Multi plateformes : RapidSVN, QSvn, Subcommander • Eclipse : Subclipse, Subversive (beta) • Visual Studio : AnkhSVN • Emacs : psvn.el
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
Les protocoles d’accès à Subversion • svn:// • svn+ssh:// • http:// • https:// • file://