Documente Academic
Documente Profesional
Documente Cultură
D. Renault
20 septembre 2011
Rsum
Le but de ce document est de donner une introduction sur Subversion, un systme
de gestion de version. Il dfinit les notions lies au contrle de version, puis dtaille
lutilisation de ce programme pour grer un projet.
Processus de travail
Lorsque lon travaille seul sur un projet sans utiliser de systme de gestion de version,
le processus de travail (workflow ) consiste gnralement crer un rpertoire de travail,
puis modifier graduellement les donnes dans ce rpertoire en faisant des modifications
successives, jusqu obtenir (dans le meilleur des cas) une version finale (release).
Init
Rev. 2
Rev. 1
Rev. n
Release
Lorsque lon travaille plusieurs sur le mme projet, ce workflow atteint ses limites.
En effet, partir dune rvision donne, plusieurs personnes peuvent travailler et crer des
rvisions diffrentes. Lensemble des rvisions prend alors une forme plus complexe :
Rev. 1a
Init
Rev. 2a
Rev. 2b
Rev. 3
Rev. n
Release
Rev. 1b
Rev. 2c
Fonctionnement de Subversion
2.1
Dpts
Subversion est un systme centralis : les donnes sont ranges dans un espace de
stockage particulier appel dpt (repository). Le dpt prend la forme dun rpertoire
ayant la structure suivante :
README.txt
conf/
dav/
db/
format
hooks/
locks/
Fichiers de configuration
Rpertoire ddi au serveur web (Apache)
Emplacement des donnes
Numro de rvision courant
Scripts personnaliss
Informations concernant les fichiers vrouills
Lexistence du dpt est une rponse lun des problmes voqus au paragraphe
prcdent : le dpt sert de rfrence pour les donnes, ce qui assure que cette rfrence
soit unique. Laccs aux donnes se fait uniquement travers le dpt, la manire dune
architecture client/serveur : toute personne (le client) participant au projet peut rcuprer
une rvision des donnes partir du dpt (le serveur), les modifier localement, pour enfin
transmettre une nouvelle rvision au dpt, afin que celui-ci puisse les redistribuer.
Les donnes sont stockes dans le dpt lintrieur dun systme de fichiers particulier
appel FSFS, et stock dans le rpertoire db/. Ce systme de fichiers diffre des systmes
de fichiers usuels (NTFS, Ext3 . . .) dans la mesure o il stocke la fois les donnes et les
diffrentes rvisions quelles ont subies depuis la cration du dpt.
En pratique, pour chaque rvision des donnes, Subversion cre un fichier delta, cest-dire un fichier contenant toutes les modifications faites aux donnes lintrieur du dpt
par rapport la rvision prcdente. Ce fichier delta est ensuite stock dans un des sousrpertoires du rpertoire db/, lintrieur du dpt.
Ainsi, Subversion permet un stockage efficace des donnes : le poids dune rvision ne
dpend que des modifications faites lors de cette rvision. Par exemple, les dplacements,
renommages ou suppressions de fichiers ont un poids ngligeable.
La cration dun dpt se fait avec la commande suivante : svnadmin create hnom_depoti o
reprsente le nom du rpertoire dans lequel sera stock le dpt. En gnral,
les dpts sont stocks sur des serveurs accessibles par Internet, comme sourceforge.net,
mais il est aussi possible de crer des dpts sur un serveur de fichier local.
hnom_depoti
2.2
Rpertoire de travail
2.3
mkdir
emacs
Dpt de la rvision
svn checkout
svn update
svn update,
svn resolved
svn commit
Globalement, le processus de travail, selon que lon travaille avec ou sans gestionnaire
de version, est le mme : il faut dabord initialiser un rpertoire de travail, puis crer des
rvisions successives par modification des donnes. Nanmoins, il existe plusieurs subtilits.
Premirement, avec Subversion, il faut communiquer avec le dpt chaque fois que lon
dsire obtenir ou transmettre des rvisions des donnes. Ensuite, au moment de transmettre
des donnes, il est possible quune personne ait dj modifi la mme partie du code que
celle que lon dsire communiquer. Il faut alors fusionner ses modifications avec la rvision
courante existant dans le dpt.
Do deux rgles de bonne conduite pour lutilisation de Subversion :
Rgle n 1 : Il faut systmatiquement mettre jour le rpertoire de travail,
en particulier avant toute communication avec le dpt.
Puisque le dpt contient la version de rfrence des sources, il est ncessaire de
se mettre jour avant de modifier les sources, mais aussi avant de les transmettre
afin de sassurer que lon na pas fait de modification en mme temps quune autre
personne. Cela permet de minimiser les risques de conflits
Rgle n 2 : Deux personnes doivent (autant que possible) travailler sur des
fichiers diffrents.
Avec Subversion, Les conflits napparaissent que lorsque deux personnes modifient
une mme zone de code dans le mme fichier au mme moment. Toutes les modifications dans des endroits distincts du rpertoire de travail (fichiers spars / zones du
code clairement loignes dans un mme fichier) sont gres automatiquement par
Subversion. Pour viter les conflits, il suffit donc de ne pas travailler en mme temps
sur une mme zone de code.
Dans les paragraphes suivants sont dcrites les principales commandes offertes par
Subversion, dans le cadre dune utilisation raisonnable du systme de gestion de version.
Retrait du dpt :
svn checkout
, svn co
Permet de crer un rpertoire de travail partir de ladresse dun dpt donne sous la
forme dune URL.
svn checkout hprotocolei ://hchemini hnom_repi
% s v n co h t t p s : / / t h o r . e n s e i r b . f r / d e p o t l o c a l _ d i r
hprotocolei
hchemini
hnom_repi
Peut prendre la valeur file pour un dpt local, http pour un dpt
accessible par WebDAV 1 , svn ou svn+ssh pour un dpt accessible
travers un serveur Subversion.
Le chemin complet daccs au dpt. Par chemin complet, on entend lURL dans le cas dun serveur distant et le chemin absolu
pour des ressources locales.
Le nom du rpertoire de travail.
svn update
, svn up
hrevisioni
% svn update
U
code . c
Updated t o r e v i s i o n 3 .
1. Web Distributed Authoring and Versioning, un protocole utilis pour sauthentifier sur un serveur
distant.
svn commit
, svn ci
svn commit
svn commit -m hcommentairei
hcommentairei
% s v n commit
/ E c r i t u r e du c o m m e n t a i r e a v e c emacs /
Sending
code . c
Transmitting f i l e data .
Committed r e v i s i o n 4 .
Usuellement, le commentaire dcrit les modifications apportes par la rvision. Il dcrit les
tests raliss pour assurer un fonctionnement correct du code, et il donne des informations
sur ltat du code aprs la rvision (Le programme compile til ? Gnre til des erreurs ?)
Import de donnes dans le dpt :
svn import
Permet dajouter directement toute une arborescence lintrieur dun dpt. Cette commande prend son utilit lorsque lon dispose dun ensemble de sources que lon dsire
intgrer lintrieur du dpt Subversion.
svn import hnom_repi hprotocolei ://hchemini -m hcommentairei
% svn import l o c a l _ d i r h t t p s :// t h or . e n s e i r b . f r / depot / l o c a l
hprotocolei
hchemini
hnom_repi
hcommentairei
svn export
Permet dobtenir un rpertoire contenant la dernire rvision des sources, mais ne contenant aucune information relative au systme de gestion de version (en particulier, aucun
rpertoire .svn). Cette commande trouve son utilit lorsque lon dsire produire une release,
une archive destine un public extrieur lquipe de dveloppement.
svn export hnom_sourcei hnom_desti
% svn e xp ort l o c a l _ d i r r e l e a s e _ d i r
svn status
, svn st
Permet dobtenir des informations concernant les fichiers dcrivant leur raison dtre sous
contrle de version. Cette information est code sous la forme dun caractre, suivi du nom
du fichier.
% svn s t a t u s
A
code . c
U
type . c
U
Makefile
Les caractres indiquant le statut dun fichier peuvent aussi apparatre lors de lutilisation
dautres commandes de Subversion. Cest en particulier le cas lors des mises jour (update),
pendant lesquelles peuvent apparatre les codes suivants :
C
G
svn log
% s v n l o g code . c
r 1 8 | r e n a u l t | 20080323 | 2 l i n e s
hfichieri
hrevisioni
hrev1i :hrev2i
C o r r e c t i o n du bug de l a mangouste .
Par exemple, la commande svn log r 1:HEAD permet dobtenir lensemble des rvisions
associes au dpt.
Affichage des diffrences entre rvisions :
svn diff
Cette commande permet de visualiser les diffrences entre deux rvisions dans le dpt,
voir entre une rvision du dpt et les fichiers actuellement dans le rpertoire de travail
(cf. paragraphe 6.1 pour plus dinformations).
hfichieri
hrevisioni
hrev1i :hrev2i
% s v n d i f f code . c
code . d e p o t . c
+++ code . l o c a l . c
@@ 1 , 1 0 +1 ,7 @@
#i n c l u d e <s t d i o . h>
#i n c l u d e <s t d l i b . h>
+#i n c l u d e <math . h>
svn add
svn delete
Lajout et la suppression dlments dans le dpt se fait naturellement avec les commandes
suivantes. Ces commandes ne modifient que le rpertoire de travail. Pour les transmettre
au dpt, il est impratif de les faire suivre dun svn commit.
svn add hfichieri
svn del hfichieri
% s v n add README. t x t
A
README. t x t
svn move
svn copy
, svn cp
La modification des fichiers lintrieur de cet espace de travail se fait la plupart du temps
avec les outils usuels, comme emacs. Nanmoins, il existe des cas particuliers qui sont la
copie, le dplacement, ou le renommage des fichiers. Si lon utilise les commandes usuelles
cp ou mv, on va crer de nouveaux fichiers qui ne sont pas dans le dpt. Et ces nouveaux
fichiers nauront pas lhistorique des fichiers partir desquels ils ont t crs. A la place,
on utilise des commandes pratiquement homonymes propres Subversion
svn mv hsourcei hdesti
svn cp hsourcei hdesti
% s v n move b a r r e . c choc . c
A
choc . c
D
barre . c
Noter que Subversion affiche ct de chaque fichier un caractre dcrivant ltat courant
de ce fichier dans le dpt (cf. la commande svn status).
10
Lorsque plusieurs personnes travaillent de manire indpendante sur les mmes fichiers
source, il arrive parfois que leurs modifications soient conflictuelles : dans le dpt coexistent deux versions diffrentes dun mme fichier. Dans les dernires versions de Subversion, un conflit est annonc de la manire suivante lors de lappel la commande svn update :
C o n f l i c t d i s c o v e r e d i n code . c .
S e l e c t : ( p ) p o s t p o n e , ( d f ) d i f f f u l l , ( e ) e d i t ,
(mc) minec o n f l i c t , ( t c ) t h e i r sc o n f l i c t ,
( s ) show a l l o p t i o n s :
Dans la mesure o il nest pas trivial de rassembler ces modifications en une seule et
unique nouvelle rvision du code, il existe un certain nombre de possibilit pour rsoudre
les conflits. En fait, Subversion est capable de grer automatiquement un certain nombre
de conflits (cf. la commande svn status, codes U et G). Lorsque le menu prcdent apparat,
il est possible de prendre plusieurs dcisions :
Repousser la dcision (p) : lutilisateur dsire grer le conflit manuellement. Il sagit
de la procdure la plus libre, et elle est dtaille dans les paragraphes suivants.
Afficher les conflits et diter la vole (df, dc, e,r) : lutilisateur peut vouloir grer
directement le conflit la main lintrieur mme du processus de mise jour. Si
lon manque de pratique, ce choix est dconseill, dans la mesure o les commandes
fournies sont limites.
Choisir une version automatiquement (mc, tc) : lutilisateur peut choisir de prfrer
une version directement sans rsoudre le conflit, la sienne (mc) ou celle du dpt
(tc). Le conflit est alors automatiquement rsolu
Dans les paragraphes suivants, nous montrons comment rsoudre un conflit manuellement,
en ayant choisi loption de repousser la dcision (p).
6.1
Supposons lexistence dun fichier de code existant dans le dpt Subversion. Actuellement, voici la version actuelle dun fichier du dpt :
Rvision initiale (code.init.c) :
1
#i n c l u d e <s t d i o . h>
2
3
4
5
6
i n t main ( v o i d ) {
p r i n t f ( " V a l u e o f P i : %.10 f \n" ,
3.1415926);
}
Ce fichier a subi des modifications de la part dun dveloppeur dans son rpertoire de
travail, et en mme temps de la part dun autre dveloppeur distant qui a communiqu ses
modifications personnelles dans le dpt. Au final, la situation est la suivante :
11
#i n c l u d e <s t d i o . h>
#i n c l u d e <s t d l i b . h>
5
6
7
1
2
#i n c l u d e <s t d i o . h>
#i n c l u d e <math . h>
3
4
i n t main ( v o i d ) {
/ P r i n t t h e v a l u e o f p i /
p r i n t f ( " V a l u e o f P i : %.10 f \n " ,
3.1415926);
4
5
6
7
i n t main ( v o i d ) {
p r i n t f ( " V a l u e o f P i : %.10 f \n" ,
4 a t a n ( 1 ) ) ;
}
r e t u r n ( EXIT_SUCCESS ) ;
9
10
Manifestement, ces deux fichiers sont dans des tats diffrents. Une manire de reprsenter les diffrences entre ces deux versions consiste utiliser la commande diff entre les
deux fichiers avec la commande suivante : diff u code.depot.c code.local.c >diff.txt
Le rsultat obtenu est le fichier diff.txt suivant :
1
2
3
4
5
6
code . d e p o t . c
+++ code . l o c a l . c
@@ 1 , 1 0 +1 ,7 @@
#i n c l u d e <s t d i o . h>
#i n c l u d e <s t d l i b . h>
+#i n c l u d e <math . h>
7
8
9
10
11
12
13
14
15
i n t main ( v o i d ) {
/ P r i n t the v a l u e of p i /
p r i n t f ( " V a l u e o f P i : %.10 f \n " ,
3.1415926);
r e t u r n (EXIT_SUCCESS ) ;
+
4 atan ( 1 ) ) ;
}
Ce fichier reprsente les diffrences entre les deux codes. Les deux premires lignes
indiquent quels sont les fichiers dont on inspecte les diffrences, et quel symbole leur est
associ (ici + pour le fichier code.local.c et - pour le fichier code.depot.c). Les diffrences entre les deux fichiers sont alors listes sous la forme suivante :
Ligne de localisation (ligne 3) :
@@ 1,10 +1,7 @@
Cette ligne permet de localiser lendroit o se situe la diffrence. Ici, elle se situe
entre les lignes 1 et 9 du fichier -, et entre les lignes 1 et 6 du ficher +.
Lignes prcdes dun + ou dun - (lignes 5, 6, 9, 11, 12, 13, 14) :
Ces lignes sont les lignes prsentes dans un seul des deux fichiers.
Lignes non prcdes dun symbole (lignes 4, 7, 10) :
Ces lignes sont les lignes communes aux deux fichiers.
12
Si lon possde le fichier diff.txt, il est alors possible de passer dune version lautre
du fichier code.c en utilisant la commande patch (loption -b permet de faire un fichier
de sauvegarde) :
pour faire passer le fichier de dpt la version locale :
pour transformer la version locale en celle du dpt :
Cest le principe la base du systme de fichiers utilis par Subversion : ne stocker que
les diffrences entre les rvisions du code. Cest aussi le mcanisme la base du processus
de gestion des conflits de Subversion.
Remarque : la commande svn diff permet dafficher les diffrences entre les fichiers actuellement dans le rpertoire de travail et une rvision donne lintrieu du dpt, voire entre
deux rvisions du dpt.
6.2
Le scnario dapparition dun conflit le plus courant est le suivant : aprs avoir travaill
sur les fichiers dans le rpertoire local, lopration de commit renvoie un message derreur
annonant que les fichiers locaux sont prims (out of date) 2 . Cela signifie que la version
locale est diffrente de la version distante. La commande update affiche alors le statut
suivant pour un fichier :
% svn update
C
code . c
Updated t o r e v i s i o n 2 .
La lettre C indique quil existe un conflit pour le fichier code.c. De plus, Subversion a
cr un certain nombre de fichiers dans le rpertoire de travail, savoir :
code.c.mine : la version locale avant mise jour ;
code.c.rOLD : la rvision du fichier avant les modifications locales ;
code.c.rNEW : la rvision du fichier la plus jour.
En plus de cela, Subversion a ajout un certain nombre de modifications au fichier initial :
2. Subversion privilgie systmatiquement la version du dpt par rapport la version locale.
13
1
2
3
4
5
6
#i n c l u d e
<<<<<<<
#i n c l u d e
=======
#i n c l u d e
>>>>>>>
<s t d i o . h>
. mine
<math . h>
<s t d l i b . h>
. r2
7
8
Fichier conflictuel :
(code.c)
9
10
11
12
13
14
i n t main ( v o i d ) {
/ P r i n t t h e v a l u e o f p i /
p r i n t f ( " V a l u e o f P i : %.10 f \n " ,
<<<<<<< . mine
4 atan ( 1 ) ) ;
=======
3.1415926);
15
16
17
18
r e t u r n ( EXIT_SUCCESS ) ;
>>>>>>> . r 2
}
6.3
>>>>>>>.r2
Rsolution du conflit
Tant que le conflit nest pas rsolu, Subversion ne permettra pas denvoyer le fichier
dans le dpt. Afin dliminer le conflit, il est ncessaire de replacer les donnes lintrieur
du rpertoire de travail dans un tat propice un svn commit. Pour ce faire, il existe plusieurs
solutions :
1. Recopier lun des fichiers code.c.rOLD ou code.c.rNEW sur le fichier code.c. Naturellement, ceci supprimera toutes les modifications locales.
2. Grer les conflits la main : ceci consiste modifier le fichier code.c de manire
obtenir une version finale qui rassemble lensemble des modifications du code. Ce
travail est facilit par le fait que les diffrences entre les deux fichiers sont encadres
par les caractres <<<<<<< et >>>>>>>, et les deux versions sont spares par =======.
14
1
2
3
#i n c l u d e <s t d i o . h>
#i n c l u d e <math . h>
#i n c l u d e <s t d l i b . h>
4
5
Fichier final :
(code.c)
6
7
8
i n t main ( v o i d ) {
/ P r i n t the v a l u e of p i /
p r i n t f ( " V a l u e o f P i : %.10 f \n " ,
4 atan ( 1 ) ) ;
r e t u r n (EXIT_SUCCESS ) ;
10
11
Lorsque lon a obtenu une version finale correcte, la rsolution du conflit se fait laide
de la commande : svn resolved code.c . Cette commande supprime les fichiers prcdemment
rajouts 3 , et prpare le rpertoire de travail pour permettre ensuite de transmettre les
modifications. Si aucune autre modification conflictuelle na t apporte au dpt entre
temps, la commande svn commit peut alors sexcuter sans encombres.
7
7.1
Complments
Ignorer des fichiers
Dans un rpertoire de travail, il existe des fichiers qui sont gnrs naturellement mais
qui nont pas vocation tre mis sous contrle de version. Un exemple naturel est celui
des excutables lorsque lon gre le code source dun programme. Nanmoins, il nest pas
pratique de les supprimer avant chaque commit du code.
La bonne solution consiste demander Subversionde les ignorer. Pour cela, chaque
rpertoire est configurable laide de la commande svn propedit svn:ignore . . Cette commande
ouvre un fichier dans un diteur de texte, fichier dans lequel il est possible dinsrer une
liste de patterns de fichiers ignorer. Pour un programme compil en C, il est par exemple
intressant dajouter la ligne " . o " dans la liste des fichiers ignorer.
7.2
Au cours dun dveloppement logiciel, certaines situations demandent mettre lensemble du code dans un tat particulier. Lexemple concret est celui dun dlivrable (release), pour lequel le code doit vrifier des contraintes dutilisabilit, de stabilit, de documentation . . .Il est possible de fixer certaines rvisions comme tant ddies ces releases,
mais alors il nest plus trs pratique dy accder.
3. Attention : lors de lapplication de cette commande, Subversion ne vrifie pas si le fichier contient
encore des modifications faire ou pas.
15
Le fait dutiliser la commande svn copy permet Subversion de ne pas recopier entirement
les fichiers, mais simplement un identifiant les reliant leur rvision dans le rpertoire
trunk. Par convention, on ne fait pas dautre commit dans un tag aprs lavoir cr.
Le rpertoire branches fonctionne quant lui de manire similaire, mais permet de crer
une nouvelle branche de dveloppement du code diffrente de trunk. Cette branche peut
vivre une vie indpendante du rpertoire principal, quitte tre ultrieurement fusionne
(merged) avec le code initial en utilisant la commande svn merge :
% s v n merge b r a n c h e s / b r a n c h 1 t r u n k r 3 :HEAD
Remarquer que les fusions de code amnent souvent rsoudre des conflits.
Bibliographie
La documentation de Subversion, accessible lURL suivante :
http://svnbook.red-bean.com/en/1.5/index.html.
Le livre correspondant, Version Control with Subversion
par C Pilato, Ben Collins-Sussman, et Brian Fitzpatrick, aux ditions OReilly.
A voir aussi . . .
Dautres systmes de gestion de versions :
CVS :
Git :
Bazaar :
http://www.nongnu.org/cvs/
http://git-scm.com/
http://bazaar.canonical.com/en/
16