La gestion de version avec Subversion Konrad HINSEN Centre de Biophysique Moléculaire (Orléans) et Synchrotron Soleil (St Aubin)
Architecture client-serveur Serveur Client Revision 1 Makefile src/init.c src/run.c Revision 2 README INSTALL Makefile src/init.c src/run.c Revision 3 README INSTALL Makefile src/init.c src/run.c doc/manual.tex svn update URL du dépôt README 3 INSTALL 3 Makefile 2 src/init.c 2 src/run.c 2 doc/manual.tex 2 Dépôt svn commit Copie de travail
Dépôts Subversion Un dépôt ou un fichier dans un dépôt est spécifié par un URL : schéma://nom:mot_de_passe@domaine:port/chemin/sur/le/serveur Schémas fréquents : http, https: Accès par un serveur Web server (lecture) svn: Accès par un serveur svn svn+ssh: Accès par un tunnel ssh et un serveur svn file: Fichier local Un dépôt local peut être utile pour : - pratiquer (aujourd hui, par exemple) - gérer des fichiers personnels
Copie de travail Une copie de travail est un répertoire sur votre ordinateur. Personne d autre ne peut y accéder. Aucune référence à ce répertoire n est conservée par le serveur. Vous pouvez en faire ce que vous voulez. Une copie de travail contient les fichiers du dépôt et des informations comptables pour Subversion. Ces informations sont stockées dans des répertoires avec le nom.svn (attention au point initial!). Ne touchez pas aux répertoires.svn si vous voulez que Subversion fonctionne correctement!
Fonctionnement de base Apporter une modification à un projet : 1) Récupérer les modifications faites par les autres développeurs: svn update 2) Faites vos modifications (page suivante) 3) Vérifiez vos modifications (page suivante) 4) Enregistrer vos modifications: svn commit -m Voilà ce que j ai fait... Le commentaire ( commit message ) est très important pour les autres développeurs... et pour vous-même quelques mois plus tard!
Modifications Modification du contenu d un fichier : Faites comme vous voulez - Subversion identifie le changement en comparant avec la dernière révision. Rajouter un fichier : svn add <filename> Il faut bien évidement d abord créer le fichier. Ce commande dit à Subversion de le rajouter à la liste des fichiers suivis. Supprimer un fichier : svn delete <filename> Le fichier est supprimé lors du prochain commit. Copier un fichier : svn copy <source...> <destination> Fonctionne comme cp sous Unix, mais retient l historique des fichiers source aussi pour les copies. Renommer un fichier : Identique à svn copy suivi de svn delete. svn move <source...> <destination>
Vérifier les modifications Obtenir une résumé des changements: svn status Montre tous les fichiers modifiés. Une lettre avant le nom du fichier indique la nature du changement : A Ajouté D Supprimé M Modifié? nouveau fichier pas (encore?) rajouté avec svn add! fichier supprimé sans passer par svn Variante: svn status -u Montre aussi les modifications faites dans le dépôt. Modifications du contenu d un fichier : svn diff <filename> Comme diff sous Unix, mais compare le fichier dans la copie de travail avec le même fichier dans la dernière révision dans le dépôt.
Gestion des conflits Scénario qui mène au conflit : - Développeur A récupère la révision X, applique des modifications, et les enregistre, créant ainsi la révision X+1. - Pendant que développeur A travaille, développeur B récupère la révision X et commence à faire des modifications.. - Développeur B tente à enregistrer ses modifications après développeur A. - Subversion constate que développeur B a modifié la révision X et mais que la révision actuelle est X+1. Il vérifie si utilisateur B a modifié un fichier qui a changé entre X et X+1. Si c est le cas, il signale un conflit. Ce que doit faire B pour résoudre le conflit: - Récupérer les modifications de développeur A avec svn update. Subversion tente alors de combiner les modifications de A et B ( merge ). Si ce n est pas possible, il propose à B une liste d actions qui peuvent aider dans la résolution du conflit, par exemple modifier le fichier à la main.
Résumé des commandes svn help <subcommand> Obtenir de la documentation. svn status Voir les changements qui ne sont pas encore enregistrés. svn log Voir un résumé de l historique du dépôt. svn diff Voir les différences entre la copie du travail et la dernière révision enregistrée. svn add <file1> <file2>... Rajouter des nouveaux fichiers à la liste des fichiers sous contrôle de version. svn commit Enregistrer les modifications et créer une nouvelle révision. svn update Mettre à jour la copie locale en intégrant les modifications faites au dépôt.
Exercices
Premiers pas avec un dépôt local 1) Créer un dépôt local: cd mkdir depots svnadmin create depots/tp 2) Créer un repertoire de travail: cd svn checkout file:///home/envol2010/depots/tp cd tp 3) Créer un petit fichier texte dans ce repertoire et le rajouter au dépôt en utilisant svn add et svn commit. 4) Modifier le fichier, vérifier l état du repertoire de travail (svn status), et enregistrer la modification (svn commit). 5) Rajouter un deuxième fichier avec svn add et svn commit. 6) Consulter l historique du dépôt avec svn log. 7)...
Exploration d un dépôt complexe 1) Récupérer une copie de travail du dépôt contenant le code source de Subversion: svn co http://svn.apache.org/repos/asf/subversion/trunk subversion-trunk (On se limite à trunk parce que le dépôt entier est gigantesque!) 2) Utiliser svn log pour savoir qui a fait quand la dernière modification. 3) Utiliser svn diff pour identifier toutes les modifications faites au cours de la dernière semaine.
Gestion des conflits 1) Récupérez une copie de travail du dépôt spécifique à cette séance : svn checkout svn+ssh://khinsen@scm.ljkforge.imag.fr/svnroot/envol2010svn 2) Rajoutez votre au fichier liste_des_participants.txt, en maintenant l ordre alphabétique. 3) Enregistrez votre modification en surveillant des conflits éventuels avec les modifications des autres participants. Faites le nécessaire pour qu aucun nom ne se perde.