[Plan du site]
Vous êtes ici ---
> Le Site du Zéro
> Les tutoriels
> Non-Officiels
> Programmation
> Environnements de développement
> Utilisation de Subversion
> Lecture du tutoriel
Utilisation de Subversion
Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Bienvenue dans ce cours sur l'utilisation basique du logiciel de versionning Subversion, considéré comme le successeur de CVS (Concurrent versions system). Très basiquement, Subversion (que je surnommerai SVN dans le reste de ce tuto) est un logiciel permettant une gestion des versions.
Je peux comprendre que l'expression "gestion des versions" peut paraître obscure à certains, mais tout va s'éclaircir une fois le premier chapître lu et compris !
Je vais essayer de rester le plus clair possible, tout en étant pas exhaustif sur les possibilités que nous offre SVN (il faudrait un big tuto d'une vingtaine de chapître pour cela).
Je conseillerai à ceux à qui ce tuto va plaire, qui voudront en savoir plus et qui ne sont pas réfractaires à l'Anglais d'aller lire
le book SVN, très complet (360 pages) et qui vous expliquera toutes les facettes du logiciel, aussi bien l'utilisation que l'administration du serveur.
Finalement, je traiterai le côté ligne de commande de SVN, je n'aborderai nulle part les diverses interfaces graphiques qui existent, telle
TortoiseSVN pour Windows.
Bonne chance !
Qu'est-ce que Subversion ?
Comme dit dans l'introduction, Subversion est un logiciel de contrôle de versions. En langage clair, il s'agit d'un logiciel qui enregistre tous les états d'une arborescence au fil du temps (par arborescence, j'entends par là à la fois la structure des dossiers, mais également le contenu des fichiers). C'est de là que vient le terme de "version", il surveille les différentes versions d'un répertoire.
Subversion (tout comme son prédécesseur, CVS) est principalement utilisé dans le cadre de développement de logiciels, et j'espère qu'avec le paragraphe précédent, vous comprendrez rapidement pourquoi. Le développement d'un logiciel est composé de multiples modifications de fichiers au fil du temps ; SVN permet d'enregistrer tous ces changements pour, par exemple, pouvoir avoir une trace expplicite et exhaustive de tous les changements faits au code source, ou pouvoir revenir au code tel qu'il était il y a 5 mois.
Basiquement, comment fonctionne Subversion ?
Sans rentrer dans aucun détail, dites-vous que Subversion réalice des
snapshots de l'arborescence à chaque changement qui lui est fait. C'est-à-dire qu'il garde en mémoire tous les changements faits à l'arborescence au fil du temps.
Imaginez que vous devez faire un dessin sur une feuille de papier, et qu'à chaque fois que vous ajouter une partie sur le dessin, vous photocopiez votre feuille et la rangez dans une archive. C'est exactement le même principe avec SVN.
Maintenant, imaginez qu'à la place de photocopier votre dessin, vous le scannez pour le mettre à dispoitions d'autres dessinateurs dans le monde via le réseau Internet, eh bien, là vous avez tout à fait compris le principe de SVN. Il permet à plusieurs développeur à travers le monde de travailler simultanément sur le même code source, grâce à différents procédés que nous mettrons en lumière plus loin.
Nota bene : Je parle depuis tout à l'heure de code source, mais le principe est le même avec des fichiers binaires (images, vidéos, etc.).
Pardon, mais si SVN garde une copie de mon dessin à chaque changement, mon archive risque de devenir relativement grosse à la longue, non ?
Merci lapin malin, en effet, sur mon exemple, ça serait le cas, mais Subversion est plus intelligent que ça et, au lieu de "photocopier" comme un bourrin tout l'arborescence à chaque fois, il analyse tranquillement ce qui a changé et réalise ce que j'appelerais joliment, un
snapshot différentiel (je ne sais pas si ce terme existe, mais c'est la classe !). En gros, il ne sauvegardera que ce qui a changé d'un snapshot à l'autre, et tout de suite, la masse de données à enregistrer est beaucoup moins importante, ce qui soulage à la fois les disques durs et les connexions.
Une histoire de révisions
Subversion, pour organiser les données qu'il enregistre, se base sur un système de
révisions. Explicitons rapidement ce terme, une révisions, pour SVN, correspond à un état de l'arborescence à un moment précis du temps. La révision 13 pourra être un snapshot du 22 juillet et la révision 14 le snapshot suivant.
SVN utilise un système de révisions global, c'est-à-dire qu'une révision correspond aux changements effectués sur l'arborescence entière depuis la dernière révisions.
La première révision est la révision 0 (ou
r0) et chaque nouvelle révision incrémente de 1 le nombre (la deuxième révision sera la révision 2 et ainsi de suite).
Dépôt et copie locale
Un système utilisant Subversion est à diviser en deux partie dinstincte, le
dépôt (ou
repository en Anglais) et la
copie locale (ou
local copy chez Shakespear). J'utiliserai à partir de maintenant ces termes à la place d'arborescence, qui est trop long et trop importun à écrire.
Dépôt
Le dépot est le côté serveur d'un système utilisant Subversion, c'est l'"archive" dans laquelle sera envoyée les modifications faites à l'arborescence (appelées
changeset* d'ailleurs). Celui-ci peut se trouver sur un serveur distant, sur un serveur situé dans le réseau local ou même sur sa propre machine.
* : un changeset est un ensemble de modifications qui formeront une nouvelle révision.
Un utilisateur "basique" (entendre un non-administrateur) de Subversion n'a pas besoin de savoir ce qui se passe dans le dépot, ce sont les mécanismes internes du processus.
Copie locale
Voilà quelque chose qui concerne beaucoup plus les utilisateurs. Une copie locale est une copie de l'état du dépôt à un moment précis, situé sur l'ordinateur d'un des utilisateurs. Reprenons mon exemple du dessin, ce que le dessinateur a est une copie locale ; et ce qu'un autre dessinateur va récupérer du dépôt sera aussi une copie locale.
C'est sur la copie locale que l'utilisateur travaille.
Créer un dépôt
Une fois Subversion installé et en état de marche, la première étape est de créer un dépôt. C'est la seule action d'administration que nous verrons (très rapidement) pour les besoins du tuto. Je suis sous Linux et toutes les actions se produiront à l'intérieur de
/home/apognu/svn. Donc pour créer un dépôt, ouvrez un terminal ou une invite de commande et tapez :
Code : Console | svnadmin create repository |
Cela a eu pour conséquences d'utiliser le programme
svnadmin pour créer (sous-programme
create) un dépôt dans le répertoire
repository.
Un rapide coup d'oeil dans le répertoire sus-cité nous fait voir son affreux contenu :
Code : Console | conf dav db format hooks locks README.txt |
Et encore, je ne suis pas allé lister les répertoires ; comme je l'ai dis plus haut, l'utilisateur lambda doit faire abstraction du contenu du dépôt, celui-ci doit être aussi important pour vous que la première représentation sur scène de Mireille Mathieu (j'emploie les grands moyens) !
Nous voilà en possession d'un dépôt vide, maintenant peuplons-le !
Checkout
Du côté utilisateur, la première chose à faire est la création de sa copie locale. C'est à cela que sert le
checkout. Basiquement, il créé une copie locale en téléchargeant le contenu du dépot à l'intérieur. Habituellement, le checkout est à faire une seule fois car, avoir deux copies locales est rarement intéressant (quoiqu'il peut l'être, mais on n'abordera pas ça ici) et parce que le checkout télécharge à chaque fois
tout le contenu du dépot ce qui dans certains cas peut être assez lourd pour les connexions Internet.
Dans notre cas, le dépôt est vide, et situé sur notre machine, donc pas de problème de poids, procédons, procédons, tapez ceci dans un terminal ou une invite de commande :
Code : Console | svn checkout file:///home/apognu/svn/repository localcopy |
Basiquement, on demande ici à SVN de procéder au checkout de dépôt situé dans le dossier
/home/apognu/svn/repository et de créer la copie locale dans le dossier
localcopy.
Si on ne précise pas, Subversion réalise toujours le checkout depuis la dernière révision existante (appelée révision HEAD), soit la dernière version du dépôt.
Voilà ce qu'on a :
Code : Console
Parfait.
Un coup d'oeil dans le dossier
localcopy ne nous montre rien sauf (si on a activé l'affichage des fichiers et dossiers cachés) un dossier
.svn. Tout comme le dépôt, ce dossier sert aux mécanismes de Subversion et n'est d'aucune utilité pour l'utilisateur que vous êtes.
Update
L'action
update de SVN est dans la lignée du checkout, dans le sens où elle télécharge des données depuis le dépôt, sauf que celle-ci ne créé pas de copie locale.
Lorsqu'un utilisateur lance une update de sa copie locale, Subversion va comparer cette dernière avec le contenu du dépôt et si celui-ci est à une révision supérieure que celle de la copie locale, SVN va télécharger le différentiel entre les deux.
Un exemple concret, vous êtes deux utilisateurs sur un même dépôt, à un temps
t, vous êtes à la révision 4, seulement là, vous partez en vacances. Pendant votre absence, votre collègue continue à travailler, et le dépôt passe à la révision 7. A votre retour, vous avez envie de récupérer ce qui a changé depuis votre départ, donc vous lancez une update, votre dépôt est mis à jour de la révision 4 à la révision 7. Vous pouvez de nouveau travailler.
Il est très important d'avoir le réflexe de lancer des updates relativement souvent, pour toujours avoir une copie locale à jour. Nous verrons dans les sous-parties suivantes les conséquences que pourraient avoir un oubli sur le travail.
Pour réaliser un update, en imaginant que vous êtes dans
/home/apognu/svn et que la copie locale se trouve dans un sous-répertoire
localcopy, lancez simplement la commande :
Code : Console
Si vous vous trouvez déjà dans le répertoire
localcopy, vous pouvez omettre de le préciser dans la ligne de commande.
Il est à noter que update ne téléchargera pas toujours des fichiers, il peut arriver (et plutôt souvent) que votre copie locale soit déjà à jour, et par conséquent le différentiel est nul : rien n'est téléchargé. Souvent, l'update est une mesure de précaution au cas où l'état du dépôt aurait changé.
Commit
Pour partir simplement, le
commit est l'action inverse de l'update et en même temps sa soeur. Update et commit seront les deux actions que vous utiliserez le plus souvent dans votre utilisation de Subverson. En gros, commit compare les modifications que vous avez faites sur votre copie locale avec l'état du dépôt, puis envoie le différentiel du changeset à celui-ci, créant par la même occasion une nouvelle révision.
Pour réaliser un commit, créons déjà un fichier
file.txt dans notre copie locale en lui mettant un contenu. Ensuite, deux étapes sont à réaliser. Tout d'abord, il faut
versionner le fichier, en gros, dire à SVN qu'il s'agit d'un fichier à prendre en compte dans le contrôle des versions ; et ensuite, lancer le commit de la copie locale. Voilà comment procéder (toujours dans
/home/apognu/svn) :
Code : Console | svn add localcopy/file.txt
svn commit localcopy |
Voilà ce qui apparait en sortie :
Code : Console | A localcopy/file.txt
Adding localcopy/file.txt
Transmitting file data .
Committed revision 1. |
La première ligne indique que le fichier
localcopy/file.txt a été prévu pour être ajouté au dépôt au prochain commit (signification de la lettre
A), et les trois dernières symbolisent le commit. Comme prévu, celui-ci ajoute le fichier, il transmet ensuite le différentiel puis nous informe que la révision 1 vient d'être créée.
Supprimer, copier, déplacer
Seul petit hic, pour déplacer, supprimer ou copier des fichiers ou dossiers, il ne suffit pas d'utiliser les fonctions fournies avec son système d'exploitation et de faire son commit, il faut utiliser les trois sous-programmes
move,
delete et
copy.
Déplacer revient à copier un fichier puis à le supprimer l'original.
Voici les trois lignes de commandes :
Code : Console | svn move FICHIER DESTINATION
svn copy FICHIER DESTINATION
svn delete FICHIER |
Maintenant, les fichiers sont dans une sorte de file d'attente où vont tous les fichiers "modifiés" en attendant le commit. Rappelez-vous qu'aucune modification n'est appliquée tant que le commit n'est pas lancé.
Exercices
A partir de là, vous connaissez les trois actions de base de SVN (checkout, update et commit), pour vous entrainer, vous pouvez simuler l'utilisation du dépôt par plusieurs personnes, en répétant les opérations checkout / modification / commit / update, etc.
Pour commencer, cela, vous pouvez dès lors créer une seconde copie locale, qui cette fois, au lieu d'être à la révision 0, sera à la révision 1. Ensuite modifiez le fichier sur la copie locale 1, commitez, puis updatez la copie locale 2.
Entrainez-vous comme cela un petit temps pour avoir bien en tête le processus. Avec un peu de (mal)chance, vous tomberez sur un bel os que je vous expliquerai dans la prochaine sous-partie.
Conflits
La première notion à assimiler dans cette sous-partie est celle de
conflits. D'après un dictionnaire, un conflit est un choc, une lutte, une rivalité. Et bien, dans Subversion, c'est exactement la même chose : il y a une rivalité entre les utilisateurs à propos des fichiers versionnés. Comment cela ?
me direz-vous. Comme ceci :
vous répondrais-je.
Supposons deux utilisateurs (Joe et Bobby) devant travailler en même temps sur un fichier
README, et que leurs modifications sur ce fichier soient pris en compte par SVN, on peut dès lors dresser le scénario suivant :
- Joe et Bobby font un checkout sur le dépot et obtiennent à la révision 1 le fichier README ;
- Ils commencent tous les deux à éditer le fichier ;
- Joe, content de lui, fait un commit avec ses modifications, le fichier est uploadé et la révision 2 est crée
- Bobby, une fois ses propres modifications terminées va vouloir en faire un commit, sauf que là c'est le drâme, un message d'erreur lui dit qu'il ne peut pas le faire !
Comment cela se fait-il ? Rappelez-vous, je vous avais dit qu'il était important de toujours avoir une copie locale à jour, or, celle de Bobby ne l'était plus au moment de son hypothétique commit : sa copie locale était encore à la révision 1 alors que le dépôt était à la révision 2. Par mesure de sécurité, Subversion bloquera le commit pour éviter qu'il ne détruise les modifications de Joe. Il y a conflit !
Mais alors, le travail du pauvre Bobby est réduit à néant ?
Que nenni ! Subversion propose plusieurs moyens de résoudre et prévenir les conflits, que nous allons étudier dans cette sous-partie.
Merging
Subversion propose, pour
résoudre un conflit, une solution de
merging, terme signifiant ici
mélange. Basiquement, cela consisite en un mélange des deux fichiers pour en obtenir un nouveau. Il y a deux type de merging pour résoudre les conflits, les voici, les voilà :
Merging "automatique"
Subversion étant un être doué d'intelligence, il est capable de réaliser certaines opérations tout seul comme un grand.
Reprenons notre exemple de conflit entre Joe et Bobby : ce dernier se retrouve comme un con avec son commit défectueux, la première chose à faire est un update, afin de mettre sa copie locale à jour. Pas de panique, cela ne supprimera pas vos modifications : SVN sait qu'il y a conflit, et va donc agir !
Le cas du merging "automatique" est efficace lorsque les modifications effectuées par les deux utilisateurs ne se "coupent" pas, par exemple, s'ils ont modifié chacun deux parties distinctes du fichier. Dans ce cas, Subversion repère ce non-recoupement et peut mélanger intelligemment les deux fichier. Voici une mise en pratique avec un fichier contenant "Bonjour !" avant toute modification :
Citation : Joe (commit réussi)Je rajoute ce texte au dessus de bonjour...
Bonjour !
Citation : Bobby (commit foireux)Bonjour !
Moi, je veux rajouter du texte en dessous !
Je suis désolé des exemple totalement débiles et sans intérêt mais il faut que tout le monde comprenne !
Comme vous le voyez ici, les modifications de l'un n'annulent pas celles de l'autre, et elles peuvent être distinctement séparées. Donc lorsque Bobby fera son update, SVN laissera le fichier README contenant :
Citation : Bobby (après l'update)Je rajoute ce texte au dessus de bonjour...
Bonjour !
Moi, je veux rajouter du texte en dessous !
Il suffit alors de faire son commit du fichier créé par Subversion pour le réussir et créer la révision 3 !
Merging "manuel"
Il arrive parfois (même plutôt souvent) que les modifications effectuées par deux utilisateurs se recoupent, et Subversion, dans ce cas, ne peut pas prendre le risque d'effectuer lui-même le merging. C'est donc à l'utilisateur responsable du conflit de le corriger lui-même ! Je vais reprendre l'exemple du book SVN qui est facile à comprendre.
Imaginez qu'un fichier versionné soit une liste de ce que deux collaborateurs veulent pour leurs sandwiches, voici ce fichier à la révision 1 :
Citation : Fichier à la révision 14 tranches de jambon
3 tomates
9 cornichons
Maintenant, imaginons que Joe aime la viande, et rajoute une tranche de jambon (cinq donc), il commit, et juste après, Bobby (toujours malchanceux avec ses commits), tente d'envoyer son commit pour les deux tranches de jambon supplémentaires :
Code : Console | Sending sandwiches.txt
svn: Commit failed (details follow):
svn: Out of date: 'sandwiches.txt' in transaction '5-1' |
Il tente de faire son update, comme la dernière fois, sauf que là, ça ne marche pas, et voilà avec quoi il se retrouve dans sa copie locale :
Code : Console | sandwiches.txt sandwiches.txt.mine sandwiches.txt.r4 sandwiches.txt.r5 |
Décortiquons un peu cela !
sandwiches.txt.mine contient le fichier que j'ai tenté de commiter,
sandwiches.txt.r4 contient le fichier à la révision précédente (avant tout changement donc) et
sandwiches.txt.r5 contient le fichier avec les modifications de Joe. Mais ce qui est intéressant est le fichier
sandwiches.txt, si on l'édite, voilà ce qu'il y a dedans :
Code : Console | <<<<<<< .mine
6 tranches de jambon
=======
5 tranches de jambon
>>>>>>> .r5
3 tomates
9 cornichons |
Et c'est là que vous prenez votre tube d'aspirine et que vous commencez à pleurer ! Sans raison, vraiment parce que ce n'est vraiment pas compliqué... Il y a deux choses à retenir, la signification des signes, on peut les résumer à cela :
Code : Console | <<<<<<< .mine
CE QUE J'AI MODIFIE
=======
CE QUE L'AUTRE A MODIFIE
>>>>>>> .rX |
Tout ce qu'il y a en dehors des signes est ce qui n'a pas été modifié. Il suffit ici de faire réfléchir un peu ses méninges : on sait qu'il y avait 4 tranches de jambon avant (le fichier
sandwiches.txt.r4 en témoigne), Joe en demande une de plus, moi deux. Un peu de maths, ça fait qu'il en faut trois de plus. On retire donc les marques en laissant la ligne, mais en mettant sept tranches de jambon.
Dans des cas réels liés à la programmation, résoudre des conflits peut s'avérer plus ardu que cela, c'est pourquoi on verra comment éviter les conflits !
Tout ce qu'il nous reste à faire est de déclarer le conflit comme résolu, puis à réaliser le commit :
Code : Console | svn resolved sandwiches.txt
svn commit -m "Conflit résolu youhouh" |
La sortie devrait être :
Code : Console | Resolved conflicted state of 'sandwiches.txt'
Sending sandwiches.txt
Transmitting file data .
Committed revision 6. |
Le conflit a aussi été résolu, mais avec plus de peine.
Il va évidemment de soi que la résolution de conflit ne marche que pour des fichier ASCII. Il est strictement impossible de résoudre un conflit sur un fichier binaire (image, vidéo, etc.) ! D'où une lecture assidue du prochain point.
Lock
Après avoir vu comment résoudre un conflit, j'espère vous avoir à vie dégouté de ces petites choses là. Je vous ai déjà dit à plusieurs reprises dans ce tuto de faire des updates régulières pour essayer d'être à jour le plus souvent possible, mais cela ne suffira toujours pas. Il ne s'agit pas seulement de prier pour qu'un conflit ne se produise pas, il faut également les empêcher. L'expression
Mieux veut prévenir que guérir prend ici tout son sens.
Bien sûr, vous pourriez, courir après vos collaborateurs pour leur dire que vous allez modifier ce fichier dans les prochaines heures, mais ce n'est ni pratique, ni productif. Non, pour cela, vous allez utiliser la fonction de
lock de Subversion.
En production, votre responsable de projet vous menacera sûrement de pratiques verre-pileuses si jamais vous n'appliquez pas un effort constant et complet sur la mise en place de locks. Et il aura raison !
Là, le nom est explicite, il s'agira de
verrouiller un fichier pendant que vous l'utiliserez, pour être certain que personne ne sera en mesure de le modifier à son tour. Mais ici encore, l'adoption d'une routine, d'une procédure d'utilisation de Subversion est requise ! En effet, demander un lock sur un fichier avant modification doit devenir une habitude ! Cela permet deux choses : d'abord d'obtenir le lock, et donc que personne ne gâche notre boulot ; mais également de s'assurer que personne n'a pris de lock sur ce fichier, et donc qu'on est pas sur le point de gâcher le boulot de quelqu'un.
Le lock doit donc devenir une institution, que dis-je ? on doit vénérer le lock. Le lock est le patron, le lock, c'est la vie, répétez après moi !
Pour demander un lock, entrez la commande suivante :
Code : Console
Ce qui donne :
Code : Console | 'sandwiches.txt' locked by user 'apognu'. |
A partir de ce moment, n'importe qui demandant un lock sur ce fichier ce verra gratifié d'un majestueux :
Code : Console | svn: warning: Path '/sandwiches.txt' is already locked by user 'apognu' in filesystem '/home/apognu/svn/repository/db' |
Il est à noter que demander un lock sur un fichier situé dans une copie locale non à jour provoquera également un message d'erreur. Demander un lock permet aussi de s'assurer de travailler sur un base saine.
Surtout, ne pas oublier de
déverrouiller le fichier une fois qu'on a fini de travailler dessus, grâce au sous-programme
unlock :
Code : Console | svn unlock sandwiches.txt |
Une fois compris le fait que le lock est le Bien, et pris l'habitude d'en demander un chaque fois que l'on désire travailler sur un fichier, le risque de création de conflits est minime, voire inexistant. Et ça c'est réjouissant !
Status
Le premier sous-programme permettant de contrôler ses commit est
status, celui-ci permet de fouiller la copie locale pour donner des informations sur ses éléments constitutifs (fichiers et dossiers). Appelée sans argument, elle affichent le(s) fichier(s) prévus pour modification au prochain commit, c'est-à-dire les fichiers ou dossiers modifiés, déplacés, supprimés, etc.
Si je modifie le fichier
sandwiches.txt et que je lance :
Code : Console
Voilà ce qui s'affichera :
Code : Console
Le
M signifie "modifié", on sait donc qu'au prochain commit, les modifications apportées au fichier
sandwiches.txt seront prises en compte. La lettre changera en fonction du type d'action réalisées sur le fichier ou dossier. Vous pouvez trouver plus d'informations à ce sujet grâce à la commande
svn help status.
En gros, cette commande vous donne une vue d'ensemble de ce que vous avez fait pour vous aider à vous représenter le commit qui va suivre.
Diff
Ca, c'est une sous-commande qu'elle est intéressante !
En gros, le principe reste le même que
status : elle donne des informations sur les modifications effectuées sur la copie locale, mais cette fois-ci à une échelle plus petite. Elle va vous donner, pour chaque fichier modifié, un détail des ajouts, retraits et modifications apportés au fichier à la ligne près.
Si j'ajoute une ligne au fichier
sandwiches.txt, et que je lance
svn diff, j'aurai cette sortie :
Code : Console | Index: sandwiches.txt
===================================================================
--- sandwiches.txt (revision 6)
+++ sandwiches.txt (working copy)
@@ -1,3 +1,4 @@
7 tranches de jambon
3 tomates
9 cornichons
+1 pot de mayonnaise |
Dans ce capharnaüm, je vois qu'entre le fichier de la révision 6 et ma copie locale, il y a eu une ligne ajoutée (le signe
+ en début de ligne) disant
1 pot de mayonnaise. Il va sans dire qu'un signe
- indique un retrait de ligne. Je signale au passage que, puisque l'unité est la ligne, la correction d'un caractère provoquera la suppression de l'ancienne ligne et l'ajout de la ligne corrigée !
Sans paramètre, la commande renvoie tous les fichiers modifiés, on peut bien entendu préciser un fichier en particulier :
Code : Console
Grand-père, comment c'était de ton temps ?
Comme je vous l'ai déjà dit plus haut, le serveur Subversion conserve une trace de touted les modifications faites au fichiers soumis au contrôle des versions. Cela a notamment pour avantage de permettre de visualiser le dépôt tel qu'il était à une révision donnée.
Pour faire cela, on utilise une option de la commande
update qui permet de spécifier à quel moment dans le temps on veut aller. Par défaut, cette option est définie à
HEAD (la dernière révision), et finalement, cette option est
-r. Ainsi :
Code : Console | svn update -r 3
U foobar
Checked out revision 3. |
Les fichier marqués
U sont les fichiers qui ont été modifiés par l'
update. Ensuite, vous pouvez parcourir, utiliser et modifier les fichiers de votre dépôt comme d'habitude.
A la fin de cette commande, vous pouvez très bien spécifier le nom d'un ou plusieurs fichiers, de sorte de ne mettre à jour que ceux-ci, et de laisser les autres à jour.
Rappelez-vous simplement que les fichiers que vous modifierez ne seront pas à jour, vous ne pourrez donc pas les envoyer sur le serveur sans action de résolution de conflit.
De plus, la commande svn revert permet d'annuler les modifications portées à sa copie locale, elle prend en paramètre le nom du fichier à "réinitialiser". Vous pouvez cependant utiliser le sélecteur universel * pour annuler tout changement à votre copie locale.
Ressuciter des fichiers
Il arrive souvent qu'on supprime un fichier du dépôt, puis qu'on veuille y retourner par la suite. Il existe plusieurs méthodes pour cela, je vais exposer la plus pratique à mon goût. Tout d'abord, il faut localiser la moment de la suppression, pour cela, on utilisera la commande
svn log. L'option
-v permet d'afficher plus d'informations.
Code : Console | svn log -v
(...)
------------------------------------------------------------------------
r7 | apognu | 2007-10-26 18:49:01 +0200 (Fri, 26 Oct 2007) | 1 line
Suppression du fichier foobar.
------------------------------------------------------------------------
(...) |
Ici, on apprend que le fichier a été supprimé le 26 octobre 2007 par apognu à 18h49 (ce qui nous fait une belle jambe), mais surtout que le fichier a été supprimé à la révision 7, ce qui signifique qu'il existait à la révision 6 ! Maintenant, on peut le copier depuis la révision :
Code : Console | svn copy -r 6 file:///home/apognu/svn/repository/foobar ./foobar
A foobar |
Le fichier vient d'être récupéré, puis "prévu pour commit" dans la copie locale, il ne reste plus qu'à commiter pour finir le travail !
Bon, et bien nous voici au terme de ce tutoriel, je pense avoir atteint mon but, à savoir vous apprendre le fonctionnement du logiciel Subversion. Mais ne me méprenez pas, connaître ce fonctionnement ne suffit pas à pouvoir gérer un projet de grosse envergure, même avec SVN, une grande organisation est nécessaire, et dans ce cas, la lecture du
book SVN dont je parlais au début de mon cours est pratiquement indispensable.
Je pense notamment à l'organisation des versions en
trunk,
branches et
tags (et tout ce qui en découle), ou tout simplement à l'administration du dépôt.
Foncez, et ne vous demandez plus pourquoi des projets tels que Wordpress, KDE, gcc ou encore Apache utilisent maintenant Subversion (avec parfois la collaboration de l'application
Trac, permettant de gérer la collaboration et l'organisation au sein du projet), la réponse est toute trouvée !