Subversion, un outil de gestion de version Florent Guilleux, Comité Réseau des Universités...

Post on 04-Apr-2015

106 views 1 download

Transcript of Subversion, un outil de gestion de version Florent Guilleux, Comité Réseau des Universités...

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 jean@example.com

AdressesJean jean@example.comDavid david@example.com

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 jean@example.com+ David david@example.com

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