Contrôle de version / Subversion Problèmes Développement collaboratif Ex. votre projet (travail en binôme) Systèmes et réseaux I David Gross-Amblard / Olivier Togni 20/09/2012 http://ufrsciencestech.u-bourgogne.fr/licence3/systemesetreseauxi/ Bob : «voici sur une clé mon boulot de hier, j'ai modifié main.sh dans projet/» John : «ok, moi j'ai juste changé toto.sh» Bob : «Ah mais moi aussi! Mais il est chez moi!» John : «De toutes façon ça marche pas, revenons en arrière» Bob: «Oui, mais j'ai pas de sauvegarde!» Problèmes Echange de fichiers nombreux Conflits de modification Accès à distance Sauvegarde et gestion de version Une solution Avec subversion (svn) : Chacun récupère le code actuel depuis un serveur central Chacun travail sur sa copie locale Chacun, quand il a terminé, valide son résultat auprès du serveur Si conflit : détection et demande de réconciliation Possibilité de récupérer n'importe quelle version passée
Dans ce cours Création d'un dépôt Synchronisation avec le dépôt Résolution des conflits Notions générales :dépôt (repository) Répertoire contenant : Toutes les versions de tous les fichiers Le journal des mises à jour (date, auteurs des mises à jours,...) Apparaît de l'extérieur comme une arborescence de fichier dans laquelle on peut naviguer selon ses droits Initialisation d'un dépôt Création du dépôt (1 fois) svnadmin create /chemin/mon/depot Importation initiale de code svn import <nom répertoire> <url du dépôt> URL : http, ssh, etc. Projet : Un dépôt contient un ou plusieurs projets Un projet n'est qu'un sous répertoire Copie de travail (working copy) Répertoire sur une machine quelconque (par nécessairement celle du dépôt) contenant une copie d'une révision des fichiers d'un projet du dépôt > svn checkout <url du repertoire> ex. > svn checkout ssh://gadavid@ufrsciencestech.ubourgogne.fr/mondepot/monprojet1
(Numéro de) révision Chaque version du dépôt possède un numéro de révision (différent révision des fichiers, comme dans CVS) Ce numéro augmente à chaque opération Permet de distinguer les versions du dépôt Suivi d'une copie locale Pour chaque fichier d'une copie locale Sur quelle révision il est basé A-t-il été modifié localement depuis? Etats possibles commitupdate (Non modifié, à jour / dépôt) : rien rien (Modifié, à jour) : maj rien (Non modifié, obsolète) : rien maj (Modifié, obsolète) : refus maj avec fusion Commit et update séparés Copie locale : contient des révisions mélangées Faire un commit : ne met pas à jour tous les fichiers Update : c'est son rôle Synchronisation Obtenir les dernières mises à jour > svn update U index.htm Updated to revision 37. Envoyer ses modifications > svn commit -m «J'ai fait ça...» Sending credits.htm Transmitting file data. Committed revision 38.
Gestion des versions «Oups, je veux revenir à la version précédentes» (rollback) > svn revert credits.htm Reverted 'credits.htm' «Finalement, notre version 36 était la mieux» > svn update -r 36 credits.htm U credits.htm Updated to revision 36. Gestion des fichiers Si modifications (ajout, effacement, renommage) de fichiers dans la copie locale, svn le signale Il faut expliciter les modifications svn add, svn delete, svn move Effectif au prochain commit Gestion des conflits Bob John Int x=0; Int x=0; Int y=2; Int z=5; println(x); println(x); Modifications dans le même fichier de deux copies locales Le premier commit (ex. Bob) passe Gestion des conflits Fusion : Modification dans des zones distinctes? Résolution automatique (merge) > svn update G merci.htm Updated to revision 42. Le commit de John ne passe pas doit faire un update fusion Ensuite commit de John
Gestion des conflits Modification dans des zones communes : conflit devant être résolu manuellement # merci.htm.mine : votre version # merci.htm.r42 : version de départ de chacun (dernier update) # merci.htm.r43 : version actuellement dans le dépôt, en conflit avec mine # merci.htm : version fusionnée avec localisation des conflits Gestion des conflits Résolution à la main (éditeur) Validation avec > svn resolved merci.htm Resolved conflicted state of 'merci.htm' > svn commit Autres notions Tags : permet de nommer une version précise, indépendament des révision Tag «version à présenter en soutenance» Permet d'y revenir facilement (release) Bifurcation du projet Autres commandes Svn help : aide intégrée Svn info : copie de travail en cours Svn log : historique des modifications Svn blame : idem, ligne par ligne Svn list : parcourir le dépôt Tronc principal Branches (versions alternatives, éventuellement fusionnées avec le tronc)
Autres commandes svn propset svn:ignore *.o. Extension.o jamais dans le dépôt svn propset svn:keywords "Id" La chaîne $Id$ est remplacée par le numéro de révision à chaque update printf(«mon projet version $Id$\n»); printf(«mon projet version 17\n»); Fichiers binaires Pas de méthode naturelle de fusion Exclusion mutuelle par verrouillage harry> svn lock banana.jpg 'banana.jpg' locked by user 'harry'. sally>svn delete banana.jpg D banana.jpg sally>svn commit -m "Delete useless file." Deleting banana.jpg svn: Commit failed (details follow): Server sent unexpected return value(423 Locked) Fichiers binaires Harry> svn unlock banana.jpg 'banana.c' unlocked. Rq : locks perdus à chaque commit (décourage de les garder trop longtemps) Nombreux Clients graphiques TortoiseSVN (Windows) Kdevelop (Linux KDE) Intégration aux IDE Eclipse, Netbeans (bouton update/commit) etc.
Accès distants Méthodes d'accès (préfixe URL) file:// accès direct (système de fichier local) http:// accès par le protocole WebDAV (serveur Apache configuré pour Subversion) https:// idem, via chiffrement SSL Ancêtres/voisins de Subversion CVS (nombreuses migrations CVS vers SVN en cours) unisson (synchronisation de répertoires) Attention à votre projet : svn demande un temps de prise en main! svn:// accès à un serveur svnserve svn+ssh:// idem, à travers un tunnel SSH (chiffrement)