CVS - indico in2p3

Transcription

CVS - indico in2p3
Tutorial SUBVERSION
FORMATION à l’utilisation de
SUBVERSION
Frédéric MELOT – LPSC / IN2P3 / CNRS (Grenoble)
[email protected]
PLAN
„
1 Présentation générale - Fonctions et avantages
„
2 Concepts fondamentaux
„
3 Description des commandes de base
„
4 Description des autres commandes courantes
„
5 Utilisation avancée de svn
„
Conclusion
2
1 Présentation générale
Fonctions et avantages
„
1.1 Ce qu’est Subversion
„
1.2 Pourquoi utiliser Subversion ?
„
1.3 D’où vient Subversion ?
„
1.4 Améliorations par rapport à CVS
„
1.5 Ce cours
3
1.1 Ce qu’est Subversion (ou svn)
„
„
Subversion est un système de gestion de versions
Il gère les fichiers et les répertoires, ainsi que leurs
modifications à travers le temps.
Principale utilisation : gérer les modifications de code source
mais également toute sorte d’information : documentation,
images, bases de données, …
Pour Subversion une données est une données quelle soit
binaire (illisible humainement) ou non
„
Logiciel gratuit et ‘open source’
„
Fonctionne sous Linux, Windows, Mac OS, …
4
1.2 Pourquoi utiliser Subversion ?
„
Permet de conserver l’historique d’une hiérarchie de fichiers :
„
„
„
„
garde une trace de toute les modifications (qui, où, pourquoi)
l’ancien code reste disponible => récupération des versions anciennes de
vos données et retour en arrière possible
on peut examiner l’historique des modifications (ex : consulter les
différences entre révisions de fichiers)
Permet de développer du code de façon collaborative par
plusieurs personnes, équipes, …
car Subversion peut agir à travers le réseau et ainsi permettre son
utilisation à différentes échelles : un service, une laboratoire, une
collaboration nationale ou internationale
„
„
les modifications effectuées par une personne sont accessibles à tous
un ou plusieurs développeur peut modifier un même fichier (les
modifications d’un fichier peuvent provenir de plusieurs sources)
5
1.2 Pourquoi utiliser Subversion ?
„
Peut servir de système de sauvegarde
„
remplace très avantageusement les ‘zip’ :
„
„
„
classement plus simple
Ne sauvegarde que les différences entre révisions => gain de place
Permet la gestion globale de l’historique de projet et permet l’interrogation
„
remplace très avantageusement les échanges de versions par mail
„
Utile aussi bien pour les collaborations que pour les individus
„
Subversion n’est pas un outil de gestion de configuration !
Ces systèmes sont spécialement conçus pour gérer du code source et
ont donc des fonctionnalités propres au développement d’applications
Ex : CMT (http://www.cmtsite.org/), tag collector, …
6
1.3 D’où vient Subversion ?
„
Dans le monde du logiciel libre, CVS (Concurrent Versions System) a été la référence pendant
des années
„
Corriger ses problèmes était très compliqué : conception et modèle de développement à revoir
„
Début 2000 la société CollabNet (http://www.collab.net) a décidé d’écrire un nouveau
système de gestion de versions :
„
„
„
En ré écrivant tout
En utilisant les idées de base de CVS mais en éliminant ses bugs et en comblant ses lacunes
Assez similaire à CVS pour permettre une transition aisée
„
Mi 2001 première version
„
Développé pour être le successeur de CVS, SVN a deux ambitions :
„
„
„
Être un système ‘free’ et ‘open source’ au design similaire à CVS
Éviter la plupart de ses défauts
Maintenant presque tous les nouveaux utilisateurs de logiciels de gestion de Versions
choisissent SVN et non CVS
7
1.4 Améliorations par rapport à
CVS
CVS
„
Gestion des versions des répertoires
CVS ne gère que l’historique des fichiers individuellement. Subversion implémente un
système de fichier “virtuel” qui permet de détecter tout changement dans la hiérarchie
toute entière de fichiers à travers le temps.
⇒
⇒
„
„
„
Plus aucune modification directe dans le repository
Les répertoires et leur historique sont désormais gérés
Historique ‘total’ des versions
Comme CVS ne gérait que les fichiers indépendamment les uns des autres, des opérations
comme les copies, le renommage ou le déplacement de fichiers n’étaient pas supportées
par CVS. De plus la création d’un nouveau fichier avec le nom d’un fichier ayant déjà existé
ne permet de repartir sur un fichier sans historique. Avec Subversion, vous pouvez ajouter,
détruire, copier, déplacer et renommer à la fois les fichiers et les répertoires. De plus tout
nouveau fichier aura son propre historique, quelque soit son nom.
Les commits sont atomiques
Un ensemble de modifications sera soit entièrement validé dans le repository soit pas du
tout. Dans CVS les commits n’étaient pas atomiques, ce qui pouvait laisser le repository
dans un état non désirable.
Gestion des métadata
Il est possible de définir pour chaque fichier et répertoire un l’ensemble de propriétés
voulues — des clés et leurs valeurs. Les différentes valeurs de ces méta données sont
gérées à travers le temps.
8
1.4 Améliorations par rapport à
CVS
CVS
„
Choix des couches de communication
„
„
„
„
„
„
Subversion peut s’intégrer à un serveur Web apache, ce qui lui permet de profiter des propriétés
(stabilité, interopérabilité, …) et des couches logicielles d’apache déjà existantes (authentification,
autorisations, compression, … )
Subversion possède également un serveur indépendant. Celui-ci possède son propre protocole et
peut être facilement accessible à travers un tunnel ssh.
Subversion a une notion abstraite d’accès au repository, ce qui permet d’en développer facilement de
nouveaux.
Gestion des fichiers binaires
Subversion exprime les différences de contenu de version les fichiers à l’aide d’un
algorithme spécifique, qui fonctionne de la même façon pour les fichiers texte que pour les
fichiers binaires. Ces deux types de fichiers sont stockés avec la même compression dans le
repository.
Branches et tags revisités (et plus efficaces)
Le coût des opérations de branches et de tag ne sont plus proportionnels à la taille du
projet. Avec Subversion la création de branche et de tag s’effectuent à l’aide d’une simple
copie du projet, ce qui revient à créer sur le repository un lien symbolique.
=> temps de l’opération faible et constant
=> plus de sticky tags !
…
9
1.5 Ce cours
„
„
„
„
„
La première interface utilisateur de Subversion est la ligne de
commande, c’est elle qui sera le plus détaillée dans ce cours
(commande svn et quelques programmes auxiliaires)
Les exemples correspondront au cas de Linux mais seront
transposables à quelques exceptions près (\ et non / pour Windows par
exemple)
En raison du lien entre CVS et SVN, il est presque impossibles de traiter
de SVN sans parler de CVS
Ce cours a été écrit pour un public ne connaissant aucun outil de
gestion de versions mais de temps en temps les différences avec CVS
peuvent être évoquer afin de faciliter son utilisation pour les anciens
CVS
utilisateurs de CVS. Un logo
est présent dans les
diapositives traitant de concepts où CVS et SVN différent
Concept similaire pour les autres logiciels de gestion de versions (RCS,
10
clear case, VSS, CVS, …)
PLAN
„
1 Présentation générale - Fonctions et avantages
„
2 Concepts fondamentaux
„
3 Description des commandes de base
„
4 Description des autres commandes courantes
„
5 Utilisation avancée de svn
„
Conclusion
11
2 Concepts fondamentaux
ƒ
2.1 Architecture (repository, working copy et communication)
ƒ
2.2 Principe de fonctionnement
ƒ
2.3 Différents modèles de systèmes de gestion de versions
ƒ
ƒ
La solution lock – modify - unlock
La solution copy – modify - merge
ƒ
2.4 Accès au repository
ƒ
2.5 Précisions sur la working copy
ƒ
2.6 Révisions
ƒ
2.7 Commandes SVN - généralités
12
2.1 Architecture
L’installation de Subversion permet l’utilisation de plusieurs programmes :
„
„
„
„
„
„
„
„
svn : le programme client en ligne de commande
svnversion : un programme permettant de connaître l’état d’une
working copy
svnlook : un outil d’interrogation directe du repository
svnadmin : un outil permettant de créer, de paramétrer et de réparer
le repository
svndumpfilter : un programme de filtrage des dumps de repository svn
mod_dav_svn : un plug-in pour le serveur apache, afin de rendre votre
repository disponible sur le réseau
svnserve : un serveur svn, lançable comme un démon ou invocable par
ssh
svnsync : un programme de recopie incrémentale de repository
13
2.1 Architecture
„
„
Subversion est un système de gestion de versions de type “centralisé”. Son système central
de données de référence s’appelle le repository
Il contient toute la hiérarchie de fichiers et tout l’historique des modifications
De l’autre côte se trouve votre client subversion qui gère une version locale d’une partie de
ces données, la “working copy”
„
„
„
„
Tout ou partie de la hiérarchie
Une seule version à un instant donné
Entre les deux, de nombreuses possibilités de communication existent à travers différentes
couches d’accès. Certaines empreinte le réseau et à travers de servers accèdent au
repository alors que d’autre ne se servent pas du réseau et accèdent directement au
repository.
Quand les clients se connectent au repository :
„
„
„
„
En écrivant, ils rendent leurs modifications disponibles pour les autres
En lisant, ils reçoivent les informations des autres
Ils peuvent aussi récupérer les états anciens du système de fichiers
Ils peuvent questionner le repository (ex : que contenait le repository lundi dernier ? , quels fichiers
ont été modifiés depuis 2 mois ? , qui a effectuer les dernières modifications dans le repository pour
un fichier donné ?, … )
14
2.1 Architecture
Working copy
Commande SVN en ligne
Application graphique
Accès au repository
DAV
SVN
Local
Réseau
RéseauTCP/IP
TCP/IP
apache
svnserve
Repository
Berkeley DB
FSFS
15
2.2 Principe de fonctionnement
Hiérarchie de fichiers avec
tout son historique
Développeur 1
Repository
Version commune du projet
A un instant donné, chaque personne possède
une version et une seule de chaque fichier
Développeur 2
Chacun a sa propre
version sur son poste
(working copy)
16
2.2 Principe de fonctionnement
Exemple d’un cas d’utilisation
Plus de connexion nécessaire
avec le repository !
Modification du
fichier A
Renvoie le projet
Demande le projet Développeur 1
Repository
Développeur 2
17
2.2 Principe de fonctionnement
Valide les modifications
du fichier A
Développeur 1
Repository
Il peut demander une
mise à jour
Et le développeur 2
qui possédait déjà le
fichier A ?
Développeur 2
18
2.3 Différents modèles de
systèmes de gestion de versions
„
Un système de gestion de versions permet :
„
„
„
„
L’édition collaborative
Le partage d’information
Tous les systèmes de gestion de versions ont le
problème fondamental : permettre le partage
d’informations sans que personne n’écrase les
données des autres
A ce problème deux solutions :
„
„
La solution lock – modify – unlock
La solution copy – modify - merge
19
2.3 Différents modèles de
systèmes de gestion de versions
Les 2 développeurs récupèrent le même projet
=> Ils ont la même hiérarchie de fichiers
Développeur 1
Repository
Développeur 2
20
2.3 Différents modèles de
systèmes de gestion de versions
Modification du
fichier A
=> A’
Développeur 1
Repository
Modification du
fichier A
=> A’’
Fichier A
Développeur 2
Les fichiers A’ et A’’ sont incompatibles
21
2.3 Différents modèles de
systèmes de gestion de versions
Valide les modifications
du fichier A
Développeur 1
Repository
Fichier A’
Développeur 2
22
2.3 Différents modèles de
systèmes de gestion de versions
Développeur 1
Repository
Fichier A’’
Valide les modifications
du fichier A
Développeur 2
Si aucun système de vérification n’existe le développeur 2 écrase les
modifications du développeur 1 !
23
2.3 La solution lock – modify –
unlock
Le développeur 1 désire modifier le fichier A
=> Il ne peut pas le modifier directement
1°) Il verrouille l’accès au fichier A
=> Il en obtient la version la plus récente
=> Le développeur 2 ne peut pas verrouiller ce fichier
Développeur 1
Repository
Développeur 2
2°) Il modifie le contenue du fichier A
3°) Il valide ses modifications
4°) Il déverrouille l’accès au fichier A
=> le développeur 2 peut verrouiller ce fichier et ainsi récupérer sa version
la plus récente
24
2.3 La solution lock – modify –
unlock
„
Solution la plus restrictive : une seule personne à la fois peut
modifier un fichier
„
Peut être bloquant
„
„
„
On doit attendre, peut être pour rien
Si quelqu’un oublie de déverrouiller …
Donne une fausse sensation de sécurité
„
„
„
Deux personnes peuvent effectuer simultanément des
modifications incompatibles sur des fichiers différents
Rien n’empêche un utilisateur de supprimer les modifications d’un
autre
=> Ce n’est pas le système de gestion de versions qui remplace la
communication
25
2.3 La solution copy – modify merge
Les 2 développeurs récupèrent le même projet
=> Ils ont la même hiérarchie de fichiers
Développeur 1 , A
Repository
Développeur 2, A
26
2.3 La solution copy – modify merge
Modification du
fichier A
=> A’
Développeur 1 , A’
Repository
Modification du
fichier A
=> A’’
Fichier A
Développeur 2, A’’
27
2.3 La solution copy – modify merge
Valide les modifications
du fichier A
Développeur 1 , A’
Erreur ‘out of date’
Repository
Valide les modifications
du fichier A
Fichier A’
Développeur 2, A’’
La version la plus récente du repository a
changé depuis la création de la working copy
du développeur 2
28
2.3 La solution copy – modify merge
Développeur 1 , A’
Récupère la dernière version
Repository
Fichier A’
=> merge du fichier
fA’ + fA’’ = fA’’’
En fait Δ = A’’ – A
A’’’ = A’ + Δ
Développeur 2, A’’’
2 cas :
ƒ Modifications compatibles => merge automatique
ƒ Modifications concurrentes => situation de conflit
=> merge manuel
29
2.3 La solution copy – modify merge
Développeur 1 , A’
Repository
Fichier A’’’
Valide les modifications
du fichier A
Développeur 2, A’’’
30
2.3 La solution copy – modify merge
Récupère la dernière
version
Développeur 1 , A’’’
Repository
Fichier A’’’
Développeur 2, A’’’
31
2.3 La solution copy – modify merge
„
„
„
Solution proposée par CVS, Subversion, …
Chacun a sa propre working copy et peut y travailler indépendamment
et simultanément. A la fin les versions sont mergées ensemble dans
une version finale (de façon automatique ou manuelle)
Peut sembler chaotique mais fonctionne extrêmement bien :
„
„
„
Pas besoin d’attendre
La plupart des modifications sur un même fichier ne donne pas lieues à un
conflit
De plus résoudre un conflit est souvent plus rapide qu’attendre un
déverrouillage
„
Les conflits peuvent être évités en améliorant la communication entre
utilisateurs
„
Mais ne convient pas aux fichiers non ‘mergeable’ => mécanisme de
lock toujours disponible
32
2.3 Différents modèles de
systèmes de gestion de versions
Avec une méthode
de lock
centralisés
Avec une méthode
de merge
Systèmes de gestion de versions
décentralisés
33
CVS
2.4 Accès au repository
„
SVN utilise des URL pour identifier les fichiers et les répertoires gérés dans le repository
„
„
„
„
„
Ex : https://lpsc.in2p3.fr:80/svn/test/web/index.html
Ex : file:///Z:/repository/SVN/test
Ex : svn info ‘https://lpsc.in2p3.fr/tests pour Planck/dev’
Différentes méthodes d’accès au repository :
Préfixe de l’url
Méthode d’accès au repository
file://
Accès direct
http://
Via apache
https://
Via apache avec une encryption ssl
svn://
Via un protocole spécifique vers un svnserve
démon
svn+ssh://
Via un protocole spécifique vers un svnserve
démon à travers un tunnel ssh
C’est votre administrateur SVN qui vous donnera cette URL
34
2.5 Précisions sur la Working
copy
„
„
„
„
Une working copy est une hiérarchie de fichiers ordinaire dans votre
système de fichiers
Vous pouvez éditer, modifier l’intérieur d’une working copy comme si
elle n’en était pas une, avec n’importe quel outil (vi, nedit, emacs,
word, excel, gimp, …). On peut aussi le compiler, debogguer, tester, …
avec ou sans connexion réseau
Votre working copy est un ‘espace privé’. Vous n’obtiendrez ni les
modifications des autres ni ne soumettrez les vôtres si vous ne le
demandez pas explicitement à l’aide de commandes SVN dédiées à cela
Vous pouvez posséder autant de working copy que vous le désirez
mais attention pas une working copy pour plusieurs utilisateurs !!
35
2.5 Précisions sur la Working
copy
„
„
„
Une working copy contient également des fichiers
‘supplémentaires’, créés et maintenus par SVN. Ils se trouvent
dans des répertoires .svn, créés dans chaque répertoire de la
hiérarchie.
NE JAMAIS LES MODIFIER !
Ils servent à SVN pour connaître l’état des fichiers, permettre
l’exécution de commande SVN sans avoir à spécifier l’URL du
repository, …
Souvent un repository héberge plusieurs projets. Dans ce cas
une working copy ne correspond souvent qu’à une partie du
repository.
36
2.5 Précisions sur la Working
copy
Récupération du projet
Développeur 1
Valide ses modifications
Récupération du projet
Récupère la dernière version
Repository
Révision la plus haute
du repository (HEAD) :
17
18
19
Développeur 2
Révision de référence
du développeur 1 :
17
18
Révision de référence
du développeur 2 :
17
19
19
37
2.5 Précisions sur la Working
copy
„
Pour chacun des fichiers, Subversion enregistre deux informations
importantes dans les répertoires .svn:
„
„
„
Sur quelle révision est basée votre working copy (version de référence), Vref
L’heure et la date à laquelle votre copie locale a été mise à jour par le
repository Tref
A partir de ces informations ainsi que de la version la plus haute dans le
repository, Vrep et de la date de dernière modification Tmod, SVN peut
trouver 4 états différents pour chacun de vos fichiers :
Observation
Inchangé localement
et à jour
Tref = Tmod et
Changé localement et
à jour
Tref ≠ Tmod et
Inchangé localement
et ‘out of date’
Tref =Tmod et
Changé localement et
‘out of date’
Tref ≠ Tmod et
Que fait une validation de
modification ?
Que fait une mise à jour de
working copy ?
Rien
Rien
Met à jour le repository
Rien
Rien
Met à jour votre working copy
Réclame une mise à jour de
working copy
Met à jour votre working copy
Vref = Vrep
Vref = Vrep
Vref ≠ Vrep
Vref ≠ Vrep
38
CVS
2.6 Révisions
„
Une validation de modifications (commit) sur le repository
provoque une transaction atomique qui concerne un certain
nombre de fichiers et/ou répertoires (modification, ajout,
suppression, renommage, déplacement, …)
„
A chaque commit, un nouvel état du repository est créé, nommé
révision
„
A chaque révision est assigné un numéro entier, incrémenté de
1 vis-à-vis de la révision précédente
„
Un repository tout juste créé (cad vide) a pour numéro de
révision 0
39
CVS
2.6 Révisions
0
1
2
‘‘
‘‘
‘‘
‘‘‘‘
3
40
CVS
2.6 Révisions
„
Les numéros de révisions sont globaux
„
contrairement aux autres systèmes de gestion de versions, les numéros de
révision de SVN s’appliquent à toute la hiérarchie de fichiers et non pas
fichier par fichier
„
Une révision correspond à un état global de tout le repository, après un
commit
„
La révision 5 correspond donc à l’état du repository après le 5ème commit
„
La révision 5 du fichier λ correspond donc à l’état du fichier λ à la révision 5
„
Le contenu de deux révisions différentes d’un même fichier ne diffère pas
nécessairement
41
CVS
2.6 Révisions
„
Dans une working copy on a souvent un mixage de numéros de
révisions
A:14
B:14
C:14
„
„
„
A:14
B:14
C:14
A:14
B:15
C:14
A:14
B:15
C:14
A:16
B:15
C:14
A:16
B:16
C:16
Après une mise à jour, tous les fichiers ont le même numéro de
révision de dernière synchronisation
Après une validation de modifications, généralement il y a
différents numéros de révision de dernière synchronisation
Les mises à jour et les validation de modifications sont des
opérations totalement indépendantes
42
2.7 Commandes SVN – généralités
„
Syntaxe générale : svn commande [options ] [arguments ]
„
L’ordre où apparaissent les options n’est pas important
„
La plupart des options ont plusieurs syntaxes (ex : --message ou -m)
„
„
„
Hors d’une working copy il est obligatoire de spécifier l’URL du repository
Dans une working copy, il n’est plus nécessaire de la préciser
Les commandes peuvent agir sur :
„
L’URL d’un repository,
„
un fichier,
„
un ensemble de fichiers,
„
Un lien symbolique (sauf sous windows)
„
un répertoire,
„
ou encore être sans cible
=> le répertoire courant (‘.’) est la cible par défaut
Si une commande agit sur un répertoire, elle agit récursivement sur tous les sous
répertoires et fichiers qu’il contient (sauf quelques exceptions)
43
2.7 Commandes SVN – généralités
„
Pour obtenir de l’aide :
„
„
svn help => pour obtenir la liste des commandes
svn help commande => pour connaître les arguments et les options d’une
commande particulière
„
Les commandes ont souvent des alias (ex : svn checkout = svn co)
„
Le nom des commandes est à interpréter en se plaçant du côté du
repository (ex : import, export, …)
„
Quand vous effectuez une opération qui requière une authentification,
subversion utilise un cache pour les sauvegarder. Pour inhiber ce
comportement :
„
„
Pour une commande donnée, utiliser l’option --no-auth-cache
De façon permanente, modifier les paramètres store-passwords et store-authcreds de votre fichier de configuration config (situé dans $HOME/.subversion)
44
2.7 Commandes SVN – généralités
„
La plupart des options de commande sont communes à toutes les
commandes
„
L’option --non-recursive (-N) permet de supprimer le caractère récursif
d’une commande
„
Vous pouvez spécifier vos paramètres d’authentification en utilisant
dans la ligne de commande : --username xxx --password xxx
„
Certaines commandes permettent de spécifier une date
=> agit sur les révisions les plus récentes non postérieures à d1
ex :
„ ’2003-12-09 22:00:00’
„ 2003-12-09 équivaut à ’2003-12-09 00:00:00’ et ’2003-12-08
24:00:00
45
2.7 Commandes SVN – généralités
„
Il est souvent nécessaire d’identifier des révisions particulières dans une
commande :
„
„
„
„
Une particulière : --revision REV ou -r REV
Un intervalle : --revision REV1:REV2 ou -r REV1:REV2
-c REV équivaut à -r REV-1:REV
REV peut être :
„
„
Un numéro de révision : --revision 3
Un mot clé :
„
„
„
„
„
„
„
HEAD, la plus haute révision du repository
BASE, la révision de référence de votre working copy
COMMITTED, la version la plus récente, antérieure ou égale à BASE, dans laquelle un élément
a changé
PREV, COMMITTED – 1
BASE, COMMITTED et PREV sont relatifs à une working copy
Une date : ‘‘{2007-04-23}’’, ‘‘{2005-12-17 15:36}’’
Exemples :
„
„
„
--revision BASE:HEAD
--revision ‘‘{2005-11-03}’’:4010
-r PREV:‘‘{2005-12-17 15:36}’’
46
PLAN
„
1 Présentation générale - Fonctions et avantages
„
2 Concepts fondamentaux
„
3 Description des commandes de base
„
4 Description des autres commandes courantes
„
5 Utilisation avancée de svn
„
Conclusion
47
3 Description des commandes de
base
ƒ
3.1 Qui fait quoi ?
ƒ
3.2 Commande checkout
ƒ
3.3 Comment SVN effectue ses comparaisons (rappel)
ƒ
3.4 Commande update
ƒ
Exemples d’update
ƒ
3.5 Checkout versus Update
ƒ
3.6 Commande commit
48
3.1 Qui fait quoi ?
Action
Modification du Modification de
repository
la working copy
Checkout
(co)
Récupérer localement un projet
depuis le repository, pour le
modifier (Working Copy)
NON
OUI
Update
(up)
Mettre à jour localement un
projet à partir du repository
(Synchronisation)
=> Récupérer les modifications
des autres
NON
OUI
Commit
(ci)
Valider des modifications
locales dans le repository
=> Rend disponible les
modifications pour les autres
OUI
NON
49
3.2 Commande checkout
Repository
„
Working copy
Afin d’utiliser un repository la plupart du temps, on récupère un projet
déjà existant :
svn co https://lpsc.in2p3.fr/svn/projetA
=> création d’une working copy à partir de la version la plus récente du projet
„
„
Cela produit un répertoire projetA, la working copy, à l’intérieur de
laquelle les commandes SVN vont fonctionner
Ce répertoire est alors entièrement modifiable, avec n’importe quel
éditeur ou outil (vi, nedit, emacs, word, excel, gimp, …). On peut aussi
le compiler, tester, … avec ou sans connexion réseau. On peut même
le supprimer !
50
3.2 Commande checkout
Repository
Working copy
„
Cette commande peut agir sur n’importe quel répertoire du repository
„
On peut renommer le répertoire obtenu :
svn co https://lpsc.in2p3.fr/svn/projetA/trunk projetA
„
Pour obtenir une working copy de la révision 1017 du projet projetA :
svn co –r 1017 https://lpsc.in2p3.fr/svn/projetA projetA-1017
„
Checkout est exécuté rarement : une seule fois pour chaque projet
=> pour se mettre à jour (récupérer les modifications des autres utilisateurs),
il faut utiliser la commande update
51
3.3 Comment SVN effectue
ses comparaisons (rappel)
„
3 origines de comparaisons pour chaque fichier :
„
„
„
„
CVS
La version courante dans la working copy
La révision de dernière synchronisation avec le repository
(checkout ou update) – ou révision ou référence
La révision la plus récente du repository (la HEAD révision)
SVN calcule deux types de changement :
„
„
entre le second et le troisième, il trouve les changements
dans le repository => ceux des autres utilisateurs
entre le premier et le second, il trouve vos changements
en local
52
3.4 Commande update
Repository
„
Working copy
Pour mettre à jour votre working copy avec la version la plus récente du repository :
svn up
=> Se synchroniser avec la version du repository
=> Pour obtenir les modifications apportées par les autres
=> On ne spécifie plus l’url du repository
„
„
Car SVN ne va vous laisser modifier que la HEAD révision d’un fichier et non pas une
version ancienne
=> obligatoire avant de valider vos modifications dans le repository
Il s’agit d’un merge (combinaison) des modifications des autres avec votre
version courante (changements dans le repository et changements en local)
=> possible automatiquement ou non
53
3.4 Commande update
Repository
„
Working copy
Quand le serveur effectue des mises à jour dans votre working copy, il vous
l’indique à l’aide de la convention suivante :
„
„
„
„
„
„
U toto : le fichier toto a été mis à jour sans merge (Update)
A toto : le fichier ou le répertoire toto a été ajouté à votre working copy (Added)
D toto : le fichier ou le répertoire toto a été supprimé de votre working copy (Deleted)
G toto : le fichier toto a été mis à jour avec un merge (merGed)
C toto : le fichier toto n’a pas pu être mis à jour à cause d’un conflit (Conflict)
…
„
Les ‘nouveaux’ dossiers dans le repository sont automatiquement récupérés
„
Mettre à jour avec la révision 1017 :
svn up –r 1017
ne pas oublier qu’il s’agit d’un merge !
54
3.4 Exemple d’update (1)
svn update
svn ci
8
Etat actuel dans la
working copy
7
?
…
Etat actuel dans la
working copy
8
7
6
6
5
5
Au départ
svn ci
La commande
Aprés
55
3.4 Exemple d’update (2)
svn ci
Etat actuel dans la
working copy
Etat actuel dans la
working copy
Etat actuel dans la
working copy
svn update
svn ci
?
modifications
modifications
7
7
6
6
5
5
56
3.4 Exemple d’update (3)
8
svn ci
Etat actuel dans la
working copy
Etat actuel dans la
working copy
svn ci
Etat actuel dans la
working copy
svn update
?
modifications
8
modifications
7
7
6
6
5
5
57
3.4 Exemple d’update (4)
Etat actuel dans la
working copy
svn update –r 5
?
modifications
8
7
Etat actuel dans la
working copy
6
5
svn ci
modifications
5
58
3.5 Checkout versus Update
„
Pour mettre à jour une working copy, toujours utiliser svn up
et non svn co
„
La commande n’utilise pas de répertoire .svn, on doit donc spécifier
l’url du repository => fastidieux
„
Si une working copy existe déjà cela est équivalent à svn up en
plus compliqué
„
„
„
Sinon
„
„
„
On ne peut pas facilement mettre à jour un seul répertoire
Que se passe t-il si l’url est différente de celle spécifiée dans les
répertoires .svn ?
Perte des modifications locales
Temps beaucoup plus long pour récupérer tous les fichiers
On ne peut pas mettre à jour un seul fichier
(svn co ne prend en argument que des répertoires)
59
3.6 Commande commit
Repository
„
Working copy
Vous mettre à jour :
svn update
obligatoire si d’autres personnes ont modifié le code
„
Valider vos modifications locale :
svn commit => ouvrira votre éditeur préféré
ou svn commit --message ’’message’’ pour un message court
ou svn commit --file logmessage sinon
=> Envoie vos modifications au repository, quel que soit leur signification
=> Renvoie un message ‘out of date’ si vous n’êtes pas à jour
=> Cela rend vos modifications disponible pour les autres
=> Le message doit décrire vos modifications
60
3.6 Commande commit
Repository
„
Working copy
Règle importante : aucun changement en local n’est jamais effectué
dans le repository avant un commit
„
Commit n’entraîne pas update
Et update n’entraîne pas commit
„
Remarque : possibilité d’envoi automatique de mail lors des commit
„
Fréquence des ‘svn ci’ : très dépendant du projet
„
„
„
„
„
Fichiers binaires ou non
Langage compilé ou interprété
Nombre de personnes impliquées
…
61
PLAN
„
1 Présentation générale - Fonctions et avantages
„
2 Concepts fondamentaux
„
3 Description des commandes de base
„
4 Description des autres commandes courantes
„
5 Utilisation avancée de svn
„
Conclusion
62
4 Description des autres
commandes courantes
ƒ
4.1 Commande import
ƒ
4.2 Modifications de la working copy –commandes add, delete, copy,
move et mkdir
ƒ
4.3 Examiner vos modifications - commandes status et diff
ƒ
4.4 Commande revert
ƒ
4.5 Résoudre les conflits - commande resolved
ƒ
4.6 Connaître l’historique du repository - commandes log, diff, list et cat
ƒ
4.7 Commandes export et cleanup
ƒ
4.8 Test d’une connexion à un repository svn
ƒ
4.9 Récapitulatif
63
4.1 Commande import
„
Copier une hiérarchie de fichiers non gérés par svn dans un repository
(ne nécessite pas de working copy) :
svn import –m ’mes’ projet https://lpsc.in2p3.fr/svn/web
=> pas de commit nécessaire (car agit sur une URL)
=> Ne transforme pas le répertoire d’origine en working copy !
=> pour travailler, effectuer ensuite un svn checkout :
svn co https://lpsc.in2p3.fr/svn/web/projet new
Puis rm –rf projet
„
Il est recommandé de prévoir dès ce stade une organisation :
„
„
„
URL_repository/trunk
URL_repository/tags
URL_repository/branches
64
4.2 Modifications de la working
CVS
copy
„
2 types :
„
Modification du contenu de fichiers déjà gérés par svn :
édition / commit
„
Modification de la hiérarchie de fichiers :
„
„
„
„
„
addition,
suppression,
copie
ou déplacement de fichiers et/ou de répertoires
Pour modifier la hiérarchie de fichiers, toujours utiliser des
commandes svn et non des commandes systèmes !
65
4.2 Modifications de la working
CVS
copy
„
Modification de la hiérarchie de fichiers
=> dans ce cas vous devez lancer une
commande :
„
Soit dans une working copy
„
„
„
elle va effectuer l’action dans la working copy
et la planifier dans vos fichiers d’administration svn (dans les
répertoires .svn) afin de l’effectuer dans le repository au
prochain commit
Soit directement dans le repository (sauf pour le svn add)
„
„
Elle va effectuer les modifications directement sans commit
Les modifications seront récupérables depuis une working
copy à l’aide d’un svn update
66
4.2 Modifications de la working
copy
„
„
svn add toto
=> Planifie l’ajout de fichier, répertoire ou lien symbolique dans le
repository
=> Si toto est un répertoire, l’ajout va concerner toute la potentielle
hiérarchie sous lui
svn delete toto (del, remove, rm)
=> Planifie la suppression de fichier, répertoire ou lien symbolique
dans le repository
=> Si toto n’est pas un répertoire la suppression est immédiate dans la
working copy et est effectuée dans le repository lors d’un commit
=> Si toto est un répertoire, sa suppression n’est pas immédiate dans
la working copy et a lieue en même temps dans celle-ci et dans le
repository lors d’un commit
=> Bien sûr toto n’est supprimé que de la HEAD révision et reste
disponible dans l’historique
67
4.2 Modifications de la working
CVS
copy
„
svn copy toto tata (cp)
=> Crée un nouveau fichier ou répertoire tata identique à toto dans la
working copy et planifie cette copy dans le repository
=> Lors de son ajout dans le repository, au commit suivant, son
origine est sauvegardée dans son historique (il provient d’une copie de
toto)
Cette commande, très utilisée, est très peu coûteuse en temps et en
espace disque (équivalent d’un lien symbolique)
tata
toto
„
„
svn move toto tata (mv, rename, ren)
=> Équivalent à svn copy toto tata puis svn del toto
svn mkdir toto
=> Équivalent à mkdir toto puis svn add toto
68
4.2 Modifications de la working
CVS
copy
„
Ajout d’un fichier préalablement supprimé:
Svn rm toto
„ Svn ci
„ Vi toto
„ Svn add toto
„ Svn ci
=> Bien qu’ayant le même nom il ne s’agira pas du
même fichier pour svn (et donc pas le même
historique)
„
69
4.2 Modifications de la working
CVS
copy
Working Copy 1
cd resa
svn mv doc document
svn ci
cd img
svn up
svn: REPORT request failed on ‘/svn….’
svn: Target path does not exist
Working Copy 2
cd resa
svn up
D doc
A document
A document/specs.doc
svn mv img image
svn ci
svn switch https://xxxxx/resa/image
Attention aux svn mv de répertoire en haut d’une hiérarchie !
70
CVS
4.3 Examiner vos modifications
„
Avant d’effectuer un svn commit, vous pouvez vouloir vérifier vos
modifications
Pour voir ce qui a été modifié : svn status
„
Pour voir les modifications en détail : svn diff
=> Permet de voir par exemple qu’un fichier a été modifié par inadvertance
=> Permet d’affiner le message de log
„
„
Ces opérations sont possibles sans connexion au repository si elles ne
concernent que vos modifications en local
„
„
Car svn conserve une version cachée de votre révision de référence
=> cela lui permet également lors d’un commit de n’envoyer que les
modifications et non tous les contenus
Svn diff peut également agir sur tout l’historique du repository et svn
status vérifier l’état de votre working copy vis-à-vis de celui du
repository
71
CVS
4.3 Commande status
„
Après svn checkout, svn update et svn commit, la commande la plus
utile !
„
Pour avoir un aperçu des modifications des fichiers ou de l’arborescence
de fichiers que vous avez effectuer :
svn status
„
„
„
Pour obtenir une information sur tous les fichiers et répertoires :
svn status --verbose ou svn status -v
„
„
„
N’affiche que les objets modifiés
Ne contacte pas le serveur
Affiche tous les fichiers avec plus d’information
Ne contacte pas le serveur
Pour ajouter une information ‘out-of-date’
svn status --show-updates ou svn status -u
„
Contacte le serveur
72
4.3 Commande status
„
Le résultat est affiché sur 6 colonnes :
„
1 : L’état du contenu du fichier ou du répertoire
„
„
„
„
„
„
„
„
„
„
„
„
„
„
2
3
4
5
6
:
:
:
:
:
‘ ’ pas de modification
‘A’ ajouté (ex : svn add ou svn cp)
‘C’ conflit
‘D’ suppression (ex : svn mv ou svn del)
‘I’ ignoré
‘M’ modifié
‘R’ remplacé (svn del puis svn add)
‘?’ non géré
…
L’état des propriétés du fichier ou du répertoire (‘ ’, ‘C’ ou ‘M’)
Si le répertoire de la working copy est verrouillé ou non (‘ ’ ou ‘L’)
Si le prochain commit contiendra l’historique ou non (‘ ’ ou ‘+’)
relatif à la commande switch
relatif aux verrous du repository
73
4.3 Commande status
„
Avec svn st -v, on obtient également le numéro de la révision de référence de la
working copy, le numéro de révision du dernier commit puis son auteur
„
Avec svn st –u, on obtient également l’information out-of-date (‘ ’ ou ‘*’) puis le
numéro de la révision de la working copy
„
Ex :
„
Svn st
A + toto (ne provient pas d’un svn add, mais plutôt d’un svn cp ou svn mv)
M
tata
„
Svn st –v
A +
M
17 5 Paul toto
17 12 Alex tata
17 5 André tutu
Status against revision: 23
„
Svn st –u
A +
17 toto
M
* 17 tata (un svn update est nécessaire avant un svn commit)
Status against revision: 23
74
4.3 Commande diff
„
Voir en détail ce que vous avez modifié :
svn diff
=> affiche à l’écran les différences dans le format diff unifié
=> cela compare la version courante à la version de référence
=> ne nécessite pas d’accès au réseau (si pas d’option)
„
Pour faire un fichier de patch :
svn diff > patch
„
Svn utilise son propre utilitaire de recherche de différence,
l’option --cmd-diff permet d’en utiliser un autre
Ex : svn diff --cmd-diff /usr/bin/diff –x ‘-i’ src
75
4.3 Commande diff
„
Exemple de réponse :
Index: src/test.c
===================================================
--- src/test.c (revision 12)
+++ src/test.c (working copy)
@@ -1 +1 @@
- If (var == 27){
+If (var == 15){
Index: src/proto.h
===================================================
--src/proto.h (revision 3)
+++ src/proto.h (working copy)
@@ -193,3 +193,4 @@
+ # Please do not remove these definitions
76
CVS
4.4 Commande revert
(perdre les modifications en local)
Etat actuel dans la
working copy
modifications
?
8
Svn update commun.php ?
7
Non
=> Svn revert commun.php
6
5
commun.php
77
CVS
4.4 Commande revert
„
Pour annuler vos modifications en local :
svn revert xxx
=> ne contacte pas le repository, donc pas d’accès réseau
=> permet d’annuler toute commande planifiée
ex :
svn add toto ou svn del toto
svn revert toto
=> la cible doit être spécifié et n’est pas récursif par défaut (sinon
utiliser --recursive ou -R)
=> svn revert XXX est équivalent à rm XXX puis svn up -r BASE XXX
mais sans contacter le repository
différent de rm XXX puis svn up !
78
4.5 Résoudre les conflits
„
Rappel (modèle copy – modify - merge) :
svn up
„
Modifications sur le serveur
U globus.h
Non
Oui
G globus.c
Oui
Oui
C server.c
Oui
Oui
Les conflits, dus à des modifications sur une même portion de
code, sont rares :
„
„
„
Modifications locales
Une seule personne travaille sur un morceau particulier de code
Les personnes travaillant sur la même fonctionnalité devraient se parler
SVN gère les révisions de hiérarchie de fichiers, il ne remplace
ni la gestion de projet ni la communication
79
CVS
4.5 Résoudre les conflits
„
Quand un conflit survient, SVN ne peut pas savoir quoi faire tout seul.
„
C’est à vous de le résoudre manuellement. Pour vous y aider :
„
Il affiche un ‘C’ durant l’update, et se souvient de cet état
„
Si le fichier n’est pas de type binaire :
„
„
il délimite les zones conflictuelles à l’aide de marqueurs de conflits dans le fichier
d’origine
il créé 3 nouveaux fichiers non gérés par svn dans votre working copy :
„
„
„
Fichier.mine, votre fichier avant l’update (n’est pas créé pour les fichiers binaires)
Fichier.rOLD_REV, la révision de référence de votre fichier
Fichier.rNEW_REV, la HEAD révision au moment de l’update
=> test.c, test.c.mine, test.c.r17, test.c.r19
„
Si le fichier est de type binaire :
„
„
il conserve votre fichier d’origine
il créé 2 nouveaux fichiers non gérés par svn dans votre working copy :
„
„
Fichier.rOLD_REV, la révision de référence de votre fichier
Fichier.rNEW_REV, la HEAD révision au moment de l’update
=> test.c, test.c.r17, test.c.r19
80
CVS
4.5 Résoudre les conflits
„
Ex : svn update
C
ls -l
server.c
server.c
=> avec des marqueurs de conflit
server.c.mine
server.c.r17
server.c.r23
„
A partir de là, SVN ne vous laissera plus faire de commit avant d’avoir
débloquer cette situation
„
3 solutions :
„
„
„
„
Résoudre le conflit à la main, à l’aide des marqueurs de conflit
Utiliser un des fichiers de référence
Utiliser svn revert
Puis dire à svn que l’on a résolu le conflit : svn resolved filename
=> Cela va effacer les fichiers temporaires et enlever l’état de conflit
„
Puis svn ci
81
CVS
4.5 Résoudre les conflits
„
Première solution : Résoudre le conflit à la main, à l’aide des
marqueurs de conflits
<<<<<<<<<<<<<<<<< .mine
One content
=================
Other content
>>>>>>>>>>>>>>>>> .r23
Marqueurs de conflits
„
L’utilisateur doit éditer ce fichier en sélectionnant une des deux versions, en
les combinant ou encore en changeant complètement le texte
„
Surtout en discuter avec l’auteur de la modification conflictuelle !
„
Puis
„
„
svn resolved xxx
svn ci -m ’message’ xxx
82
CVS
4.5 Résoudre les conflits
„
Deuxième solution : Utiliser un des fichiers de référence
svn update
C
ls
server.c
server.c server.c.mine server.c.r17 server.c.r23
cp server.c.mine server.c => perd les modifications de l’autre
cp server.c.r17 server.c => perd vos modifications et celles de l’autre
cp server.c.r23 server.c => perd vos modifications
si vous le désirez vous pouvez également modifier ces fichiers
svn resolved server.c
svn commit -m ’message’ server.c
„
Troisième solution : Utiliser svn revert => perd vos modifications
„
Revient à faire cp server.c.r23 server.c
mais svn resolved n’est pas nécessaire
83
4.6 Connaître l’historique du
repository
„
„
Le repository conserve toutes les modifications
validées par chaque commit
Il vous permet de ‘remonter le temps’ et d’examiner
toutes les révisions :
„
„
En récupérant une révision donnée (svn co -r REV ou svn
update -r REV)
En questionnant l’historique du repository :
„
„
„
„
svn
svn
svn
svn
log => affiche tous les messages des log
diff => affiche le détail des modifications
cat => affiche le contenu d’un fichier pour une révision
list => liste le contenu d’un répertoire pour une révision
84
4.6 Connaître l’historique du
repository – commande svn log
„
Pour obtenir des informations sur l’historique d’un fichier ou
d’un répertoire :
svn log
=> affiche la liste des informations relatives à chaque commit
pour l’entité voulue :
„
„
„
„
Le numéro de révision
L’auteur du commit
La date
Le message de log
=> Les informations proviennent uniquement du repository
„
svn log == svn log -r BASE:1
85
4.6 Connaître l’historique du
repository – commande svn log
„
Ex :
svn log
-------------------------------------------------------------------------------------r1197 | paul | 2006-10-13 12:45:52 +0200 (Fri, 13 Oct 2006) | 1 line
Harmonisation des commentaires
-------------------------------------------------------------------------------------r1190 | jean | 2006-10-12 17:51:05 +0200 (Thu, 12 Oct 2006) | 1 line
Modification du format de date pour les années : 06 -> 2006
--------------------------------------------------------------------------------------
…
„
„
„
„
svn log --revision 1017:1212
svn log generateur.cpp -r 1212:1017
svn log https://lpsc.in2p3.fr/svn/Web/resa/trunk -r 17
svn log –r 17 => n’affichera rien si dans le répertoire courant aucune
modification n’a affecté la révision 17 du repository
86
4.6 Connaître l’historique du
repository – commande svn log
„
Afin de connaître la liste des fichiers modifiés :
svn log -r 816 -v
-------------------------------------------------------------------------------------r816 | melot | 2005-08-22 16:51:25 +0200 (Mon, 22 Aug 2005) | 1 line
Changed paths:
M /trunk/commun/commun.php
M /trunk/reservation.php
A /trunk/config/commun/interface.php
*** empty log message ***
--------------------------------------------------------------------------------------
„
Importance du message de log lors de chaque commit !
„ Il doit être utile
„ Ex : svn –m ’ajout de valeurs par défaut pour toutes les
variables’ commit
87
4.6 Connaître l’historique du
repository – commande svn diff
„
3 usages :
„
Connaître vos modifications en local (pas d’accès au réseau) :
„
„
Comparer votre working copy au repository (un numéro de révision
en argument) :
„
„
„
„
svn diff
=> Entre la révision courante et celle de référence
svn diff –r BASE
=> Entre la révision courante et celle de référence
svn diff –r HEAD
=> Entre la révision courante et la HEAD révision
svn diff –r 1017
=> Entre la révision courante et la révision 1017
Comparer deux versions du repository (deux numéros de révision
en argument) :
„
„
svn diff –r BASE:HEAD
=> Entre la révision de référence et la HEAD révision
svn diff https://lpsc.in2p3.fr/svn/projetA/src -r 1012:HEAD
88
4.6 Connaître l’historique du
repository – commandes cat et list
CVS
„
Pour afficher le contenu d’un fichier pour une révision donnée :
svn cat -r 12 compare.php
svn cat https://lpsc.in2p3.fr/svn/new.txt
=> les affiche à l’écran
„
Pour lister le contenu d’un répertoire pour une révision donnée (sans
les télécharger) :
svn list https://lpsc.in2p3.fr/svn/Web/resa
branches/
tags/
trunk/
svn list -v https://lpsc.in2p3.fr/svn/Web/resa
346
206
278
113
andre
paul
alain
paul
1339
Nov 19
Jun 22
Sep 03
Jan 17
19:55 README
17:20 branches/
10:25 tags/
15:04 trunk/
89
4.7 Commandes export et
cleanup
„
CVS
Pour obtenir une copie de la hiérarchie de fichiers :
svn export https://lpsc.in2p3.fr/svn/Web/resa/trunk reservation
pas de création de working copy !
„
Exporte la HEAD révision par défaut sinon -r REV
=> pour mettre en production ou diffuser un logiciel
„
„
Quand svn modifie votre working copy :
„
„
„
Il commence par noter son intention dans un fichier de log (dans .svn)
Il exécute la commande
Il détruit le fichier de log
„
Si l’opération est suspendue (process tué, arrêt du PC, …) la commande n’est
pas exécutée mais le fichier le log reste
„
Pour finir toute opération inachevée :
svn cleanup
=> votre working copy retourne dans un état cohérent
=> supprime les éventuels lock des working copy
=> mais ne fonctionne pas toujours !!! => attention à Ctrl-C sur svn ci !
90
4.8 Test d’une connexion à un
repository svn
„
Installer la dernière version de svn et mettre l’exécutable dans le PATH
„
Demander à votre administrateur svn l’url du repository
„
„
„
Vous authentifier avec la méthode adéquate (mises au point préalables
souvent nécessaires)
Essayer une commande d’interrogation non liée à une working copy
ex :
„ svn list https://xxx
„ svn info https://xxx
Installer une interface graphique
91
4.9 Récapitulatif
Commande
Nécessite une
Working copy
Peut prendre une URL comme
argument (=> pas de commit)
Modifie le
repository
Peut être lancé sans
connexion au
repository
Checkout
Non
Toujours
Non
Non
Update
Oui
Non
Non
Non
Commit
Oui
Non
Oui
Non
Import
Non
Toujours
Oui
Non
Add
Oui
Non
Non
Oui
Delete
Non
Oui
Oui ou non
Oui
Mkdir
Non
Oui
Oui ou non
Oui
Copy
Non
Oui
Oui ou non
Oui
Move
Non
Oui
Oui ou non
Oui
92
4.9 Récapitulatif
Commande
Nécessite une
Working copy
Peut prendre une URL comme
argument (=> pas de commit)
Modifie le
repository
Peut être lancé sans
connexion au
repository
Status
Oui
Non
Non
Oui
Diff
Non
Oui
Non
Oui
Revert
Oui
Non
Non
Oui
Resolved
Oui
Non
Non
Oui
Log
Non
Oui
Non
Non
List
Non
Oui
Non
Oui
Cat
Non
Oui
Non
Oui
Export
Non
Toujours
Non
Non
Cleanup
Oui
Non
Non
Oui
93
PLAN
„
1 Présentation générale - Fonctions et avantages
„
2 Concepts fondamentaux
„
3 Description des commandes de base
„
4 Description des autres commandes courantes
„
5 Utilisation avancée de svn
„
Conclusion
94
CVS
5 Utilisation avancée de svn
„
5.1 Gestion des méta données
„
„
„
„
Utilisation
Utilisation
Utilisation
Utilisation
des
des
des
des
méta
méta
méta
méta
„
5.2
5.3
5.4
5.5
5.6
„
5.7 Branches et tags
„
„
„
„
„
„
„
„
„
„
données
données
données
données
:
:
:
:
portabilité de fichiers
fichiers non gérés par svn
mots clés de substitution
définitions externes
Mécanismes de verrouillage
Identification absolue de révision
Svn et les authentifications
Configuration du client svn
Localisation
Branches
Branches
Branches
Branches
Tags
Branches
–
–
–
–
définition et utilité
création
svn merge
svn switch
– cas usuels
95
5.1 Gestion des méta données
„
En plus de la gestion de versions des fichiers et des répertoires, svn
gère :
„
„
„
„
Une propriété est un couple (nom de propriété , valeur de propriété)
Ex : (‘copyright’, ‘Paul et André’),
(‘tests unitaires effectués’,’partiellement’), …
Un nom de la propriété doit :
„
„
„
„
les méta données (ou propriétés) sur ces fichiers et répertoires
leur gestion de versions
Être de type non binaire
Commencer par une lettre, ‘:’ ou ‘_’
Ne pas commencer par ‘svn:’
Une valeur de propriété est totalement libre. Elle peut même être
binaire.
96
5.1 Gestion des méta données
„
svn utilise également de façon interne des méta données :
„
„
„
Elles ont les mêmes caractéristiques que les vôtres sauf :
„
„
„
Pour sauvegarder des caractéristiques de fichiers ou de répertoires
ex : svn:executable, svn:mime-type, svn:ignore, svn:needs-lock, svn:eolstyle, svn:keywords, …
Pour conserver les caractéristiques des commit, des méta données
associées à chaque révision
ex : svn:author, svn:date, svn:log, …
Leur nom commence par ‘svn:’
Aucune gestion de versions ne leur est associée dans le cas des méta
données de révision
=> toute modification entraîne la perte de la valeur précédente
=> à modifier avec prudence
Vous pouvez également modifier ces méta données, si vous savez ce
que vous faites !
97
5.1 Gestion des méta données
Classification :
Méta données Méta données gérées par svn
utilisateur
Versionnées
Non versionnées
(méta données de révision)
Exemple : copyright
svn:executable svn:log
98
5.1 Gestion des méta données
„
Pour ajouter une nouvelle méta donnée :
svn propset svn:executable ‘*‘ functions/spacecraft.exe
svn propset copyright –F /usr/local/file_copyright.txt pg.c
=> pour les valeurs sur plusieurs lignes ou pour les fichiers binaires
„
Pour ajouter ou modifier une méta donnée :
svn propedit copyright functions/spacecraft.c
=> ouvre votre éditeur par défaut avec un contenu nul en cas d’ajout ou avec
l’ancienne valeur en cas de modification
„
„
Toutes les commandes de manipulation de méta données ne
sont pas récursives par défaut, utiliser l’option ‘-R’ pour qu’elles
le soient
Ces commandes agissent dans la working copy, les valider à
l’aide d’un svn commit => création d’une nouvelle révision
99
5.1 Gestion des méta données
„
Les commandes propset et propedit permettent également la
manipulation des méta données non versionnées de révision,
elles agissent alors directement dans le repository :
„
„
svn propset svn:log --revprop -r HEAD ‘passage à la norme XHTML 1.1’
svn propedit svn:log --revprop -r 1017
=> cela est possible ou non en fonction de la configuration du repository
(impossible par défaut)
=> pas de svn commit nécessaire et perte de l’historique !
„
Pour obtenir la liste des méta données d’un élément :
„
„
„
„
svn proplist -R functions/*
svn proplist -v => pour obtenir également les valeurs
svn proplist --revprop -r HEAD => pour obtenir les propriétés de révision
Pour obtenir la valeur d’une méta donnée :
„
„
„
svn propget copyright
svn propget -R svn:mime-type
svn propget --revprop -r 1032 svn:author https://...
100
5.1 Gestion des méta données
„
Pour supprimer une méta donnée :
svn propdel copyright functions/calc.h
=> car svn propset copyright ‘’ functions/calc.h ne supprime pas la
méta donnée
„
Préférer utiliser propedit plutôt que propset, afin de toujours partir de
la valeur précédente
„
Les modifications de méta données sont gérées de la même façon que
celle des fichiers et des répertoires :
„
„
„
„
„
„
Merge lors d’update
Conflits possibles
svn status les notifie
svn revert permet d’annuler vos modifications en local
…
Remarque : il n’existe pas de méthode particulière pour rechercher une
valeur particulière de méta donnée
101
5.1 Utilisation des méta données :
portabilité de fichiers
„
Portabilité des fichiers
„
„
„
„
„
La séquence de caractères permettant de repérer les fins de lignes
est différente sous Windows (CRLF) et sous Linux (LF)
Linux utilise les liens symboliques, pas Windows
L’exécutabilité d’un fichier est défini par un bit dans le système de
fichiers sous linux, par une extension de nom de fichier différente
sous Windows
…
Svn gère ces différences et donc la portabilité des fichiers à l’aide
des méta données :
„
„
„
„
svn:executable (existe ou non)
svn:mime-type (rien, ‘application/octet-stream’ ou mime-type plus
précis : ‘image/png’, ‘application/x-shockwave-flash’, ‘text/plain’, … )
svn:eol-style (‘native’, ‘CRLF’ ou ‘LF’)
svn:special (renseigné pour repérer les liens symboliques, rien sinon)
102
5.1 Utilisation des méta données :
portabilité de fichiers
„
„
„
C’est lors de l’utilisation de svn add et svn import que svn ajoute ses
méta données de fichiers :
„ svn:executable est positionné si le fichier a le bit d’exécution activé
(pas géré avec Windows)
„ svn:mime-type est positionné par svn à ‘application/octet-stream’ si
son algorithme lui indique un fichier non texte
Ces méta données sont très importantes car elles conditionnent de
nombreux comportements de svn (diff textuel, merge, …)
=> d’où l’intérêt de la validité de leur valeur
Afin d’améliorer le comportement par défaut (corriger les erreurs,
suivre les évolutions ou être plus précis) :
„ On peut définir ses propres préférences dans son fichier de
configuration (~/.subversion/config)
„ On peut éditer les méta données à la main
103
5.1 Utilisation des méta données :
fichiers non gérés pas svn
„
Dans une working copy, tous les fichiers ne doivent pas être gérés par svn :
„
„
„
„
„
„
„
svn add et svn import sont récursifs par défaut => risque de les importer par
erreur
Ces fichiers vont être listé à chaque svn status
=> on peut demander à svn de les ignorer définitivement
Pour cela :
„
„
„
„
Fichiers intermédiaires de compilation
Fichiers dépendant de l’environnement de l’utilisateur (utiliser des templates)
Backups des éditeurs
…
Utilisation de l’option global-ignores de votre fichier de configuration
(~/.subversion/config)
=> affecte les opérations d’un utilisateur d’un ordinateur (backup d’éditeur, …)
Utilisation de la méta donnée svn:ignore
=> affecte des éléments d’un repository (fichiers de compilation, …)
Si les deux sont renseignés, leur concaténation est utilisée
Ex : ‘*.o *.exe *~’
104
5.1 Utilisation des méta données :
mots clés de substitution
„
Svn permet de substituer des mots clés à l’intérieur du contenu de
fichiers
„
Le plupart de ces mots clés décrit des caractéristique de la HEAD révision
„
Ex : si vous désirez obtenir en haut de chaque fichier la date de sa
révision, vous pouvez demander à tous les utilisateurs de la saisir
manuellement mais c’est une mauvaise solution :
„
„
Le format risque de fluctuer
Les oublis sont inévitables
=> mieux vaut demander à svn de le faire !
„
Méthode : placer $keyword$ dans un fichier, là où vous voulez effectuer
cette substitution et activer la substitution à l’aide de la méta donnée
correspondante
=> A chaque nouvelle révision, il sera remplacé par $keyword: valeur $
105
5.1 Utilisation des méta données :
mots clés de substitution
„
Différents mots clés possibles :
„
„
„
„
„
„
Précautions :
„
„
„
„
$Date$ => $Date: 2006-07-22 21:42:37 -0700 (Sat, 22 Jul 2006) $
$Revision$ => $Revision: 165 $ (révision de dernier changement)
$Author$ => $Author: melot $
$URL$ => $URL: https://lpsc.in2p3.fr/svn/Web/reservation.java $
$Id$ => $Id: index.php 15 2004-10-18 15:48 melot $
Bien respecter la casse
Placer ces mots clés dans des zones ne gênant pas la compilation ou
l’interprétation des fichiers (en zone commentée par exemple)
Ne fonctionne pas avec les fichiers binaires
Pour dire à svn de substituer un mot clé pour certains éléments :
„
svn propset svn:keywords ‘Date Revision’ functions/*
106
5.1 Utilisation des méta données :
définitions externes
„
Dans un projet vous pouvez avoir besoin d’inclure une
bibliothèque provenant d’un autre repository
„
Pour cela vous pouvez utiliser différents checkout dans une
même working copy mais tout le monde devra en faire autant
„
Les définitions externes permettent d’inclure des liens vers
d’autres projets dans le repository et donc pour tout le monde
„
Ex :
svn co https://lpsc.in2p3.fr/svn/planck/spacecraft
cd spacecraft/communication
svn co https://svn-lal.in2p3.fr/planck-hfi/cm
svn co https://planck.in2p3.fr/com/rooter
107
5.1 Utilisation des méta données :
définitions externes
„
Méthode :
„
„
„
Utiliser la méta donnée svn:externals
Cela va effectuer le lien entre le répertoire local et l’url d’une révision d’un
projet géré par svn
Ex :
svn co https://lpsc.in2p3.fr/svn/planck/spacecraft
cd spacecraft
svn propedit svn:externals communication
cm https://svn-lal.in2p3.fr/planck-hfi/cm
appli/rooter -r23 https://planck.in2p3.fr/com/rooter
=>
spacecraft / …
/ communication / cm …
/ appli / rooter / …
/ …
108
5.1 Utilisation des méta données :
définitions externes
„
Une fois qu’un utilisateur a définit des définitions externes, tous les autres
utilisateurs vont récupérer les arborescences de fichiers des repository spécifiés,
lors de checkout ou d’update
„
Définir la méta donnée svn:externals toujours avec propedit et non propset car
elle est sur plusieurs lignes
„
Le nom d’une définition externe ne doit pas exister dans le repository d’origine
„
Il est recommandé d’utiliser des numéros de révision lors de la définition de ces
liens externes car
„
„
„
On ne maîtrise pas l’évolution des repository distants et svn update agira sur toute la
hiérarchie
=> il mettra à jour les définitions externes avec la HEAD révision
un svn update -r REV agira sur toute la hiérarchie et dans les repository externes ce
numéro de révision n’est pas pertinent
Mais attention les working copy créées sont déconnectées de la working copy
d’origine
=> un svn commit en haut de la hiérarchie ne sera pas récursif dans les
définitions externes
109
5.2 Mécanismes de verrouillage
photo.jpg
svn co
svn ci
Développeur 1
svn co svn up
Repository
svn ci
Développeur 2
Out-of-date !
=> photo.jpg, photo.jpg.r26, photo.jpg.r27
=> Un des deux développeurs a perdu son temps
110
5.2 Mécanismes de verrouillage
„
Mécanisme de verrouillage pour :
„
Sérialiser dans le temps l’accès en écriture à certains fichiers
„
„
„
Aider la communication
„
„
„
En prévenant que certains fichiers sont verrouillés
Permet d’éviter d’effectuer des modifications qui ne pourront pas être
validées
Opérations possibles :
„
„
„
„
Permet de réclamer le droit exclusif de les modifier
Le commit sera possible et le temps de modification jamais perdu
Verrouiller/ déverrouiller
Voir quels fichiers sont verrouiller
Spécifier pour quels fichiers le mécanisme de verrouillage est
recommandé
Remarque : verrou d’exclusion sur le serveur ≠ verrou de
working copy (empêcher des accès concurrents sur 1 wc)
111
5.2 Mécanismes de verrouillage
„
Pour créer un verrou :
svn lock photo.jpg –m ’changement de la couleur de fond’
=> que si le fichier est à jour dans la working copy
„
svn status affichera un ‘K’ (locKed) en sixième colonne pour l’auteur du
verrou, un ‘O’ (Other) pour les autres s’ils ont utilisé l’option -u
„
Le verrou est protégé par un jeton, qui est contenu dans la working
copy
„
L’auteur du verrou et lui seul, depuis sa working copy, peut effectuer
un svn commit, qui va supprimer le verrou ou s’il veut supprimer le
verrou :
svn unlock photo.jpg
112
5.2 Mécanismes de verrouillage
„
Pour avoir des informations sur un fichier en particulier :
…
Lock
Lock
Lock
Lock
svn info https://lpsc.in2p3.fr/svn/Web/README
Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Owner: Henry
Created: 2004-02-17 19:56:43
Comment: j’en ai pour 5 minutes
„
L’administrateur peut supprimer les locks (svnadmin lslocks et svnadmin
rmlocks) mais également tous les utilisateurs !
„
Pour supprimer le verrou d’un autre :
svn unlock --force photo.jpg
„
Pour ‘voler’ le verrou d’un autre :
svn lock --force photo.jpg
„
Supprimer ou voler un verrou peut être ponctuellement utile mais si cela arrive
trop souvent il y a un souci de communication
113
5.2 Mécanismes de verrouillage
„
Celui qui s’est fait supprimer son verrou verra après un svn status -u
un ‘B’ (Broken) ou un ‘T’ (sTolen)
„
Une politique de verrou plus stricte peut être appliquée par
l’administrateur (à l’aide des hooks pre-lock et pre-unlock)
„
„
Le mécanisme de verrou seul ne résout pas le problème initial de perte
de temps
Si un utilisateur ne lance pas la commande svn st –u avant d’effectuer
des modifications …
La solution consiste à proposer un mécanisme rappelant aux
utilisateurs que pour certains fichiers ils doivent effectuer un
verrouillage / déverrouillage :
„
„
„
Positionnement de la méta donnée : svn:needs-lock
Attachée à un fichier, subversion va changer ses permissions dans le
système de fichiers afin de le rendre accessible en lecture seul
La commande svn lock changera cet état dans la working copy
114
5.3 Identification absolue de
révision
„
svn rm test.h
svn commit
…
svn add test.h
svn commit
„
=> les deux fichiers test.h sont différents pour svn ! Ils ne
partagent pas le même historique
„
=> comment faire pour accéder à l’un ou à l’autre ?
„
Utiliser un numéro de révision supplémentaire :
test.h@REV est le fichier test.h à moment de la révision REV
115
5.3 Identification absolue de
révision
librairies.php
functions.php
Révision 13
commun.php
„
„
„
„
„
„
„
„
svn
svn
svn
svn
svn
cat
cat
cat
cat
cat
-r
-r
-r
-r
-r
10
10
10
10
33
commun.php
commun.php@34
commun.php@17
commun.php@3
commun.php@2
Révision 23
commun.php
=> Unable to find repository location
for ‘commun@17’ in revision 10
svn cat commun.php Ù svn cat commun.php@BASE dans une wc
svn cat https://xxx/commun.php Ù svn cat https://xxx/commun.php@HEAD
hors wc
116
svn cat commun.php@REV Ù svn cat -r REV commun.php@REV
5.4 Svn et les authentifications
„
svn --version permet de connaître :
„
„
La version du client svn
Les protocoles de communication que svn connaît (http, https, svn ou file)
„
Pour la plupart des opérations svn n’a pas besoin de contacter le serveur
=> pas d’authentification nécessaire
„
svn ne demande de s’authentifier que lors d’opérations le nécessitant
„
Après une authentification, svn met en cache (dans des fichiers dans
~/.subversion/auth) vos paramètres d’authentification et ne vous les
redemandera pas
=> sauf en cas d’authentification par certificat
=> sauf si vous utilisez --no-auth-cache ou store-auth-creds (voir après)
„
„
Sous windows, protection par encryption avec une clé par utilisateur
Sous linux, protection par droits sur les fichiers
117
5.5 Configuration du client svn
„
Les utilisateurs peuvent vouloir utiliser de façon systématique de
nombreuses options des commandes svn
„
„
Ex : --no-auth-cache pour chaque commande
Pour cela svn permet de stocker vos ‘préférences’ dans des fichiers de
configuration
„
„
„
Fichier servers
Fichier config
Stockés dans la zone de configuration de svn
„
„
Une propre à chaque machine
Une propre à chaque utilisateur
„
Ces fichiers sont modifiables à l’aide de n’importe quel éditeur et ne
sont pas versionnés !
„
Ils contiennent une liste de couples (clé / valeur) contenue dans
différentes sections
118
5.5 Configuration du client svn
„
La première fois qu’une commande svn est exécutée, la zone de
configuration de subversion par utilisateur est créée (avec des valeurs
par défaut) :
„
„
„
La zone de configuration de svn par machine n’est pas créée
automatiquement. Elle se situe :
„
„
„
Dans $HOME/.subversion sous linux
Dans C:\Documents and Settings\user\Application Data\Subversion sous
Windows (répertoire caché et la localisation dépend de la version)
Dans /etc/subversion sous linux
Dans C:\Documents and Settings\All Users\Application Data\Subversion
sous Windows (répertoire caché et la localisation dépend de la version)
Ordre de priorité des options :
1.
2.
3.
Options de commande
Options de configuration par utilisateur
Options de configuration par machine
119
5.5 Configuration du client svn
„
„
„
La zone de configuration par utilisateur contient également un répertoire Auth
qui sauvegarde les authentifications mises en cache, protégé par des droits
d’accès
Pour réinitialiser la zone de configuration par utilisateur, rm -rf
$HOME/.subversion puis svn --version par exemple mais perte du répertoire
Auth
Sous Windows, la configuration peut également être sauvée dans la base de
registre
„
„
„
„
C’est à l’initiative de l’utilisateur
HKEY_LOCAL_MACHINE\Software\Tigris.org\Subversion pour la configuration par
machine
HKEY_CURRENT_USER\Software\Tigris.org\Subversion pour la configuration par
utilisateur
Ordre de priorité :
1.
2.
3.
4.
5.
Options
Options
Options
Options
Options
de
de
de
de
de
commande
configuration
configuration
configuration
configuration
par
par
par
par
utilisateur du fichier de configuration
utilisateur de la base de registre
machine du fichier de configuration
machine de la base de registre
120
5.5 Configuration du client svn
Fichier servers
„
Ce fichier est relatif aux couches réseau
„
Il contient 2 sections :
„
Groups
„
„
„
Permet de définir des noms de machines ou de domaines pour définir
des comportements propres à des serveurs svn
Ex :
[groups]
lpsc=lpsc.in2p3.fr
tigris = tigris.org
[lpsc]
…
[tigris]
…
Global
„
Permet de définir des comportements par défaut, pour tous les
serveurs n’étant pas trouvés dans une des sections de [groups]
121
5.5 Configuration du client svn
Fichier servers
„
Principales options :
„
„
„
„
„
„
„
„
http-proxy-host, http-proxy-port, http-proxyusername, http-proxy-password, http-proxyexceptions
http-timeout
http-compression
neon-debug-mask
ssl-authority-files
ssl-trust-default-ca
ssl-client-cert-file
ssl-client-cert-password
122
5.5 Configuration du client svn
Fichier config
„
Tout ce qui ne concerna pas le réseau !
„
Section [auth] pour gérer les authentification et autorisations :
„
„
„
store-passwords par défaut yes
store-auth-creds par défaut yes (toute information d’authentification)
Section [helpers] pour gérer les applications externes
„
editor-cmd l’éditeur pour saisir les logs durant les commit ou les valeurs de
propriété
„
„
„
„
„
Ordre de pritorité : option --editor- en ligne de commande, variable
d’environnement SVN_EDITOR, option editor-cmd, variables d’environnement
VISUAL, EDITOR
diff-cmd le chemin absolue vers un programme de diff pour générer la
sortie des svn diff
diff3-cmd le chemin absolue vers un programme de diff pour effectuer le
diff entre 3 versions
Si diff-cmd et diff3-cmd ne sont pas spécifiés, svn utilise des librairies
internes, différentes de diff et diff3 de GNU
Si vous désirez utilisez d’autres exécutables que ceux de GNU, il est
nécessaire de regarder les interfaces
123
5.5 Configuration du client svn
Fichier config
„
Section [tunnels] pour gérer les tunnels ssh
„
Section [miscellany] pour tout le reste
„
„
„
„
„
global-ignores utilisé par svn status, svn add et svn import, à ajouter à la
valeur de la méta donnée svn:ignore
enable-auto-props pour utiliser les valeurs définis dans la section auto-props
pour les nouveaux éléments ajoutés au repository (svn add et svn import)
log-encoding définit l’encodage par défaut des messages de log (toujours
sauvegardés en UTF-8) – nécessaire si différent de la locale du système
d’exploitation
use-commit-times permet de positionner le timestamp des fichiers et
répertoires d’une working copy non pas à celui de dernière modification
dans la working copy mais dans le repository
Section [auto-props]
„
Ex :
*.c = svn:eol-style=native
*.cpp = svn:eol-style=native
*.sh = svn:eol-style=native;svn:executable
*.jpg = svn:mime-type=image/jpeg
124
5.6 Localisation
„
Permet d’obtenir une internationalisation de svn :
„
Pour tous les messages émis par svn
„
„
„
Pour les données saisis vers svn
„
„
En fonction de la variable d’environnement LC_MESSAGES
affiche tous les messages dans une langue donnée
Cela n’est possible que si subversion possède le fichier de
traduction pour la langue spécifique
ex : /usr/share/locale/de/LC_MESSAGES/subversion.mo
svn convertit les noms de fichiers, les chemins et les messages
de log depuis votre langue vers de l’unicode, en UTF-8
Pour le français : setenv LC_ALL fr_FR
125
5.6 Localisation
Rappel concernant les locales (région ou pays où les
conventions de localisation s’appliquent)
„
Sous linux, commande locale :
„
$ locale:
LANG=
LC_COLLATE="C "
LC_CTYPE="C"
LC_MESSAGES="C "
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL="C"
Si LC_ALL est positionnée toutes les autres variables ont sa valeur
„
Si LANG est positionnée toute autre variable non initialisée a sa valeur
$ locale -a => permet de connaître la liste des locales disponibles sur le système
„
„
„
Sous windows, panneau de configuration, options régionales
126
5.7 Branches – définition et utilité
„
„
Une branche est une ligne de développement indépendante des autres
mais qui partage un historique commun
Elle est toujours créée à partir d’une copie d’un répertoire déjà existant
et possède ensuite son propre historique
On créé des branches afin de :
„
„
„
„
maintenir plusieurs versions très similaires en même temps du même
logiciel => branches de fonctionnalité
Ex : un programme de gestion de ventes de PC et d’imprimantes partageant
90% de code commun
corriger des erreurs sur des versions anciennes
développer temporairement dans un environnement différent de celui des
autres développeurs
À l’extrême de ne développer que dans des branches et n’utiliser la branche
principale que pour y appliquer les modifications de branches
127
5.7 Branches – définition et utilité
„
„
„
À chaque branche correspond un répertoire à la
racine du projet (et non du repository)
Trunk est une branche particulière : c’est la branche
d’origine, qui reste souvent la branche ‘principale’
Svn vous permet de :
„
„
„
„
„
créer des branches de fichiers et de répertoires
les maintenir en parallèle
vous informer de leur origine
appliquer les modifications d’une branche dans une autre
mixer plusieurs branches dans une même working copy
128
5.7 Branches – définition et utilité
Revenir à la branche principale
Appliquer cette correction
à la branche principale
32
30
28
Δ
33
27
18
19
16
15
9
3
Corriger un bug sur une
version ancienne (3)
2
Créer deux versions
différentes du produit (avec
des fichiers en commun)
1
simulation.cpp
129
5.7 Branches – création
„
/
/
resa
resa
„
trunk
trunk
„
branches
branches
RMS
RMS
Vous désirez écrire une nouvelle
fonctionnalité, qui va affecter tous les
fichiers du projet pendant plusieurs
semaines
Vous ne voulez pas déranger vos collègues
qui développent d’autres fonctionnalités
Vous désirez effectuer des svn commit
régulièrement sans pour autant finaliser vos
modifications
„
„
trunk
trunk
„
branches
branches
113
Car vos modifications sont très importante en
taille
Vous désirez pouvoir sauvegarder vos
modifications et les diffuser (avec vos
collègues ou si vous avez plusieurs working
copy)
Vous désirez pouvoir récupérer les
modifications effectuées par les autres dans
la branche principale
=> création d’une branche
130
5.7 Branches – création
„
Pour créer une branche, vous effectuez une copie de la partie du repository qui
vous intéresse, en utilisant la commande svn copy
„
Cette copie peut s’effectuer n’importe où mais il est de coutume de l’effectuer
dans le répertoire ‘branches’
„
„
Vous allez donc créer un nouveau répertoire ‘multiresa’ dans le répertoire
resa/branches, qui va commencer d’exister en tant que copie du répertoire
resa/trunk
2 façons de le faire :
„
„
„
cd resa
svn copy trunk branches/multiresa
svn status
A + branches/multiresa
(c’est une copie de quelque chose pas une nouveauté)
svn commit –m’création de la branche multiresa pour les réservations multi objets’
svn copy https://xxx/resa/trunk https://xxx/resa/branches/multiresa –m’création de la
branche multiresa pour les réservations multi objets’
Attention, en shell : le résultat de cp rep1 rep2 dépend de l’existence de rep2 131
5.7 Branches – création
/
Branche principale
/
resa
resa
Branche pour le développement
parallèle
trunk
trunk
branches
branches
RMS
RMS
multiresa
multiresa
trunk
trunk
branches
branches
113
114
svn copy trunk branches/multiresa
svn commit -m ’création de la
branche multiresa’
Vous allez donc créer un nouveau répertoire
‘multiresa’ dans le répertoire resa/branches,
qui va commencer d’exister en tant que
copie du répertoire resa/trunk
132
5.7 Branches – création
„
„
„
Les branches ne partagent pas le même emplacement dans la
hiérarchie de fichiers du repository mais partagent le même référentiel
de temps : les mêmes numéros de révision
Les autres utilisateurs qui travaillent dans le trunk, lors de leurs ‘svn
update’ ne récupéreront pas vos mises à jour effectuées dans la
branche
Concepts clé : svn n’a pas de concept interne de branche.
„
„
„
„
Le résultat d’une copie est une branche car vous lui associez cette
signification
Une branche est en fait un répertoire comme les autres, que svn gère
comme n’importe quel répertoire
Cela est contraire aux autres systèmes de gestion de versions qui utilisent
une dimension supplémentaire
Une copie est une opération à temps et espace disque constant
=> Vous pouvez en créer aussi souvent que vous le désirez
133
5.7 Branches – création
118
110
114
branches/multiresa
120
trunk
cd resa/branches/multiresa
svn log –v calendar.php
cd resa/trunk
svn log –v calendar.php
-------------------------------------------------------------------------------------r118 | melot | 2005-08-22 16:51:25 +0200 (Mon, 22 Aug 2005) | 22 lines
Changed paths:
M resa/branches/multiresa/calendar.php
changes in the headers variable to respect standards
-------------------------------------------------------------------------------------r114 | melot | 2005-08-20 11:15:08 +0200 (Sat, 20 Aug 2005) | 2 lines
Changed paths:
A + resa/branches/multiresa/calendar.php
création de la branche multiresa pour les réservations multi objets
-----------------------------------------’--------------------------------------------r110 | dupond | 2005-08-17 16:58:43 +0200 (Wed, 17 Aug 2005) | 1 line
Changed paths:
M resa/trunk/calendar.php
Application du XHTML 4.0
-------------------------------------------------------------------------------------…
-------------------------------------------------------------------------------------r120 | dupond | 2005-08-22 18:50:15 +0200 (Mon, 22 Aug 2005) | 1 line
Changed paths:
M resa/trunk/calendar.php
changes in the headers variable to respect standards
-------------------------------------------------------------------------------------r110 | dupond | 2005-08-17 16:58:43 +0200 (Wed, 17 Aug 2005) | 1 line
Changed paths:
M resa/trunk/calendar.php
Application du XHTML 4.0
-------------------------------------------------------------------------------------…
134
5.7 Branches – svn merge
118
110
114
Δ
119 120
branches/multiresa
trunk
„
Afin de ne pas trop diverger, il peut être utile de récupérer de temps en temps
les modifications des autres d’une branche à une autre
„
Pour voir les différences :
svn diff -r 119:120 https://xxx/resa/trunk
„
Pour les récupérer :
cd resa/branches/multiresa
svn merge -r 119:120 https://xxx/resa/trunk
Cette commande est très similaire à svn diff mais au lieu d’afficher les
différences, elle les applique à votre working copy, en tant que modifications
locales :
svn status
M calendar.php
135
5.7 Branches – svn merge
„
La commande merge compare deux arbres du repository et les
applique à une working copy
„
La commande merge requière 3 arguments :
„
„
„
Une version initiale du repository
Une version finale du repository
Une working copy qui va accueillir les différences en tant que modifications
locales (par défaut le répertoire courant)
ex :
„
„
„
„
svn merge -r 112:143 https://xxx/resa/trunk
svn merge https://xxx/branches/b1@153 https://xxx/branches/b2@176
branches/b3
Les modifications sont apportées dans des fichiers de même nom
Il existe une différence entre appliquer le résultat d’un diff et exécuter
un merge car le merge gère beaucoup plus de type de différences
(changement de méta données, modification d’arborescence, …)
136
5.7 Branches – svn merge
„
svn update permet de se déplacer dans le temps alors que svn merge
„
S’il n’y a pas de modifications locales :
permet de se déplacer dans le temps et dans l’espace (de la hiérarchie
de fichiers) !
„
„
„
La résolution de conflit est similaire à celle résultant d’un svn update, à
part le nom des fichiers générés :
„
„
„
svn update n’implique jamais de conflit
svn merge peut en générer
file.mine, file.rOLD_rev et file.rNEW_rev pour svn update
file.working, file.merge-left et file.merge-right pour svn merge
Avant d’effectuer un svn merge, il est recommandé de commencer par
pré visualiser son résultat :
„
„
„
avec svn diff …
avec svn --dry-run merge …
car si vous aviez des modifications locales, svn revert vous les supprimera
137
5.7 Branches – svn merge
„
„
„
Après un svn merge il est également recommandé de vérifier manuellement les
modifications => svn diff et svn status
Si les modifications ne vous conviennent pas => svn revert
(attention si modifications locales)
Si les modifications vous conviennent => svn commit en n’oubliant surtout pas
de spécifier dans le message l’origine des modifications (issues d’un merge de
branche)
„
„
Car si vous importez les modifications d’une branche à une autre de temps en temps, il
est nécessaire de garder une trace fiable afin de ne pas réimporter les mêmes
modifications plusieurs fois
Attention svn merge se soucie du lien de ‘parenté’ entre différentes révisions
d’un même fichier
Ce n’est pas le cas pour svn diff !
librairies.php
functions.php
commun.php
Révision 13
Révision 23
commun.php
138
5.7 Branches – svn merge
Δ
118
110
„
114
124
Δ
120
trunk
Cas d’utilisation : merger tout le contenu d’une branche dans une autre
trunk
cd resa
svn merge https://xxx/multiresa@HEAD https://xxx/trunk@HEAD
cd resa
svn merge -r 114:HEAD https://xxx/multiresa trunk
cd resa/trunk
svn merge -r 114:124 https://.../multiresa
„
branches/multiresa
+ svn ci
+ svn ci
Méthode pour retrouver la révision de création de la branche :
svn log –v --stop-on-copy resa/multiresa
139
5.7 Branches – svn merge
Δ
Δ
118
110
„
114
159 branches/multiresa
124
120
125
trunk
Cas d’utilisation : merger tout le contenu d’une branche dans une autre
en plusieurs fois
cd resa
svn merge -r 114:HEAD https://xxx/multiresa trunk
svn ci -m’merge la branche multiresa –r114:124 dans le trunk’
svn merge -r 114:HEAD https://xxx/multiresa trunk
=> car on a déjà récupéré les modifications de r114 à r124
svn merge -r 125:HEAD https://xxx/multiresa trunk
svn ci -m ’merge la branche multiresa –r125:159 dans le trunk’
„
Les messages de log sont dans ce cas extrêmement importants car
sans eux on ne peut plus savoir où on en est !
140
5.7 Branches – svn merge
(perdre les modifications en local)
Etat actuel dans la
working copy
modifications
?
8
Svn update commun.php ?
7
Non
=> Svn revert commun.php
6
5
commun.php
141
5.7 Branches – svn merge
Dans la working copy
9
svn update –r 6
8
svn commit
7
? du repository)
8
(perdre des modifications
6
7
svn merge –r 8:6 https://xxx 6
svn commit
5
5
Cette commande a enlevé un ‘delta’ entre deux révisions et a
effectué le merge avec la version de la working copy
142
5.7 Branches – svn merge
„
svn merge peut servir à ‘dévalider’ des modifications validées dans le
repository, que vous n’auriez sûrement jamais dû valider
„
Cela permet de revenir à l’état voulu mais l’historique reste toujours
inchangeable : la modification n’affecte que le HEAD
„
La commande :
svn merge -r 8:6 https://xxx
svn commit -m ’undoing changes committed in 8 and 7’
„
Il existe cependant des méthodes pour supprimer définitivement du
repository des révisions non voulues
„
„
Par des commandes d’administration => pas l’utilisateur
Utile par exemple en cas d’ajout non désiré de documents confidentiels
143
5.7 Branches – svn merge
„
Récupérer un fichier détruit dans le repository :
„
„
cd resa/commun
svn rm init_config.php
svn commit -m ’init_config.php ne sert plus’
…
On commence par rechercher l’emplacement et la révision du fichier que l’on
recherche à l’aide de la commande svn log –v
r1197 | paul | 2006-10-13 12:45:52 +0200 (Fri, 13 Oct 2006) | 1 line
Changed paths:
D commun/init_config.php
…
„
Première méthode :
svn merge -r HEAD:1196 https://xxx/commun
mais attention récupérera toutes les autres modifications (=> svn revert)
„
Méthode à préférer :
svn copy -r 1196 https://xxx/commun/init_config.php commun/init_config.php
„
Et toujours un commit avec un commentaire utile :
svn commit -m ’récupération du fichier supprimé commun/init_config.php depuis la
révision 1196’
144
5.7 Branches – svn switch
„
La commande svn switch, bien que utile, n’est pas nécessaire pour travailler
avec des branches, mais permet un gain de temps pour certaines opérations
„
Elle transforme une working copy d’une hiérarchie de fichiers à une autre
„
Ex :
„
On aurait obtenu la même chose avec
cd resa/trunk
svn switch https://xxx/resa/branches/multiresa
U commun.php
U config.php
svn co https://xxx/resa/branches/multiresa
„
Mais souvent le trunk et les branches ne différent que de quelques fichiers dans
une partie limitée de l’arborescence
=> seuls les différences sont envoyées
=> gain de temps
145
5.7 Branches – svn switch
„
On peut utiliser --revision pour ne pas récupérer la HEAD
révision
„
svn update permet de se déplacer dans le temps à l’intérieur
„
Une working copy peut ainsi contenir un mixte de numéros de
révisions mais également un mixte de hiérarchies de fichiers
„
Dans un tel cas, svn update et svn commit agiront
récursivement dans chaque portion de la hiérarchie
d’une hiérarchie de fichiers donnée
svn switch permet de se déplacer dans le temps et dans la
hiérarchie de fichiers
svn update est en fait un cas particulier de svn switch
146
5.7 Branches – svn switch
„
Cas d’utilisation :
„
„
„
En général en copie l’entièreté du trunk pour créer la branche
On switch seulement une partie pour gérer la branche (un répertoire ou un
fichier)
Cela permet de continuer de recevoir les modifications du trunk, sans les
appliquer dans la branche
„
Lors d’un svn switch les modifications en local sont gardées (merge),
comme lors d’un svn update
„
Cas d’utilisation : vous avez effectué des modifications dans le trunk et
vouliez en fait les effectuer dans une branche :
„
„
„
„
vous switchez vers la branche
effectuez le commit dans la branche
switchez vers le trunk
svn switch met à jour une working copy en pointant vers une autre
URL du même repository et svn switch --relocate en pointant vers le
même repertoire d’une autre URL (ex : changement de serveur)
147
5.7 Tags
„
Un tag est un snapshot du repository à un instant donné
„
Une révision est déjà un snapshot de la hiérarchie de fichiers à un
instant donné
„
„
Mais un tag permet de lui donner un nom plus attractif qu’un entier et
peut ne concerner qu’une partie de la hiérarchie de fichiers
Ex : il est plus simple de se souvenir du tag ‘release-1.9’ que de retenir
que la version finalisée est un répertoire particulier de la révision 8842
Pour créer un tag :
„
„
svn copy https://xxx/resa/trunk https://xxx/resa/tag/version-1.1 -m ‘tag de
la version 1.1 de resa’
svn copy –r 2062 https://xxx/resa/trunk https://xxx/resa/tag/version-1.1 -m
‘tag de la version 1.1 de resa’
148
5.7 Tags
„
Il s’agit de la même méthode que pour créer une branche !!!
„
Pour subversion une branche ou un tag sont des répertoires comme les
autres, créés par une copie
„
Il n’existe pas de ‘dimension’ supplémentaire pour les représenter
„
La différence entre les deux, c’est vous qui la faites !
„
Si vous ne modifiez pas un répertoire copié, il s’agit d’un tag
„
Dés que vous modifiez pas un répertoire copié, il s’agit d’une branche
„
C’est pour les distinguer que l’on créé des répertoires trunk, tags et
branches dans les repository
149
5.7 Tags
„
On peut également créer un tag ‘complexe’, en créant dans une
working copy un mixte de numéros de révisions (avec svn
update) et de hiérarchies de fichiers (avec svn switch) puis :
svn copy trunk https://xxx/resa/tags/versionTest -m ‘création de
tag avec la révision 3924 du trunk mixé avec la révision 4808 de
la branche multiresa’
=> vos modifications locales, non validées, seront copiées
„
Il n’est pas recommandé d’utiliser cette méthode pour créer une
branche car on ne sait plus après avec exactitude d’où provient
la branche, surtout s’il y avait des modifications locales
150
5.7 Branches – cas usuels
„
Dans le cas de développement d’applications, il existe deux cas ‘classiques’
d’utilisation de branches :
„
Branche de release
=> cas des logiciels distribués sous forme de release
Δ
tags/1.0.0
117 118
110
114
124
120
128
125
tags/1.0.1
139
branches/1.0
trunk
branches/2.0
Fin des développements de la version 1.0 du code dans le trunk, en 114
=> Il faut la tester et commencer à développer la version 2.0
Création d’une branche de release
„
„
„
„
„
„
„
„
Correction de bug
Développement de la version 2.0
Portage(s) des corrections de bugs dans la branche principale
La branche est taggée 1.0.0 et délivrée
Elle est par la suite maintenue et peut donner lieu à d’autres releases
Création d’une nouvelle branche de release pour la version 2.0
151
5.7 Branches – cas usuels
„
Branche de fonctionnalité
=> branche temporaire créée pour des développements complexes pouvant
‘nuire’ à la stabilité du trunk
Δ
118
121
„
„
„
114
126
Δ
branches/multiresa
Δ
Δ
110
124
120
125
127
trunk
Créer une branche de fonctionnalité : multiresa
Effectuer des modifications dans le trunk et dans la branches
Effectuer des merges du trunk vers la branche régulièrement (ex : toutes les semaines)
svn merge -r 114:120 https://xxx/trunk branches/multuresa + ci
svn merge -r 121:125 https://xxx/trunk branches/multuresa + ci
svn merge -r https://xxx/trunk@HEAD https://xxx/branches/multuresa@hEAD trunk + ci
„
Remarque : dans certains cas on cherche à effectuer le merge de la branche vers le trunk
152
et dans d’autres cas du trunk vers la branche
5.7 Branches
svn update, svn merge, svn switch, …
=> imaginez vos fichiers dans un espace à deux
dimensions :
hiérarchie de fichiers / numéros de révisions
Hiérarchie de fichiers
…
trunk/init
trunk/config
trunk/img
branches/multiresa
branches
trunk/commun
trunk
Numéros de révisions
1
2
3
4
5
6
7
8
9
10 11 12 13
14 15 16
153
PLAN
„
1 Présentation générale - Fonctions et avantages
„
2 Concepts fondamentaux
„
3 Description des commandes de base
„
4 Description des autres commandes courantes
„
5 Utilisation avancée de svn
„
Conclusion
154
Utilisation d’interface graphique
„
TkSVN
„
„
„
Utilisable sous Linux, Windows et Mac/OS
Basé sur Tcl/Tk
TortoiseSVN
„
Pour Windows
„
TRAC
„
…
„
Un grand avantage des GUI : la visualisation graphique du résultat d’un diff
„
„
„
avec TkSVN : TkDiff
il existe des logiciels permettant de visualiser des différences entre fichiers word,
excel, …
Mais les interfaces graphiques ne permettent pas de tout faire
„
„
toutes les options des commandes ne sont généralement pas implémentées
bugs
155
Conclusion
„
Documentation disponible :
„
„
„
„
http://subversion.tigris.org et http://svnbook.red-bean.com
http://svn.haxx.se/users
http://www.svnforum.org
Groupe de discussion sur http://lpsc.in2p3.fr/elog/SVN
„
Ce cours est à adapter en fonction de votre environnement
„
Aucun code ne devrait être développé sans un outil de gestion de
versions
„
Si on est tout seul, l’utilisation en est simplifié => jamais d’update
nécessaire, ni de conflit mais on peut créer des branches
„
SVN est censé vous faire gagner du temps, pas en perdre
„
Questions
156
Sommaire
1 Présentation générale - Fonctions et avantages………………………………………………………………..
1.1 Ce qu’est Subversion………………………………………………………………………………………………..
1.2 Pourquoi utiliser Subversion ?......................................................................................
1.3 D’où vient Subversion ?...............................................................................................
1.4 Améliorations par rapport à CVS………………………………………………………………………………..
1.5 Ce cours………………………………………………………………………………………………………............
3
4
5
7
8
10
2 Concepts fondamentaux………………………………………………………………………………………...........
2.1 Architecture (repository, working copy et communication)………………………………............
2.2 Principe de fonctionnement……………………………………………………………………………..........
2.3 Différents modèles de systèmes de gestion de versions……………………………………..........
La solution lock – modify – unlock………………………………………………………………………………
La solution copy - modify – merge……………………………………………………………………….......
2.4 Accès au repository………………………………………………………………………………………………..
2.5 Précisions sur la working copy………………………………………………………………………………...
2.6 Révisions……………………………………………………………………………………………………….........
2.7 Commandes SVN – généralités………………………………………………………………………………...
11
13
16
19
24
26
34
35
39
43
3 Description des commandes de base……………………………………………………………………………….
3.1 Qui fait quoi ?............................................................................................................
3.2 Commande checkout……………………………………………………………………………………….........
3.3 Comment SVN effectue ses comparaisons (rappel)……………………………………………………
3.4 Commande update………………………………………………………………………………………...........
Exemples d’update……………………………………………………………………………………………………
3.5 Checkout versus Update………………………………………………………………………………............
3.6 Commande commit………………………………………………………………………………………………..
47
49
50
52
53
55
59
60
Sommaire
4 Description des autres commandes courantes……………………………………………………………………
4.1 Commande Import…………………………………………………………………………………………………….
4.2 Modifications de la working copy - commandes add, delete, copy, move et mkdir…………..
4.3 Examiner vos modifications - commandes status et diff……………………………………………….
4.4 Commande revert……………………………………………………………………………………………………..
4.5 Résoudre les conflits - commande resolved…………………………………………………………………
4.6 Connaître l’historique du repository - commandes log, diff, list et cat…………………………….
4.7 Commandes export et cleanup……………………………………………………………………………………
4.8 Test d’une connexion à un repository svn……………………………………………………………………
4.9 Récapitulatif……………………………………………………………………………………………………………..
62
64
65
71
77
79
84
90
91
92
5 Utilisation avancée de svn………………………………………………………………………………………………..
5.1 Gestion des méta données…………………………………………………………………………………………
Utilisation des méta données : portabilité de fichiers………………………………………………………
Utilisation des méta données : fichiers non gérés par svn……………………………………………….
Utilisation des méta données : mots clés de substitution………………………………………….......
Utilisation des méta données : définitions externes………………………………………………………..
5.2 Mécanismes de verrouillage……………………………………………………………………………………….
5.3 Identification absolue de révision……………………………………………………………………………….
5.4 Svn et les authentifications ……………………………………………………………………………………….
5.5 Configuration du client svn………………………………………………………………………………………..
5.6 Localisation………………………………………………………………………………………………………………
94
96
101
104
105
107
110
115
117
118
125
Sommaire
5.7 Branches et tags………………………………………………………………………………………………………
Branches – définition et utilité……………………………………………………………………………………..
Branches – création…………………………………………………………………………………………………….
Branches – svn merge…………………………………………………………………………………………………
Branches – svn switch…………………………………………………………………………………………………
Tags………………………………………………………………………………………………………………………….
Branches – cas usuels………………………………………………………………………………………………..
127
127
130
135
145
148
151
Conclusion……………………………………………………………………………………………………………………….
154

Documents pareils