Un espace si dense
SVN, gestionnaire de version

Le travail avec SVN

dimanche 11 février 2007 par guillaume

SVN est un outil libre de gestion de versions. C’est à dire qu’il nous évite d’avoir 156 fichiers sur notre ordinateur avec marqué v1....vn.

Ce petit aide mémoire est destiné à ceux qui travaillent seuls ou en groupe sur un projet SVN.

Une dernière chose, si vous voulez ’apprendre’ à vous servir de SVN pour un projet déjà en cours, allez directement sur checkout...

Création de dépôt (repository) svn

Le dépot svn est la base de données comportant toutes les versions, les modifications et les logs de votre programme géré par subversion. Ce dépôt peut être installé sur un serveur (indispensable si vous travaillez à plusieurs), mais aussi sur le système de fichiers (voire sur une clef USB( !), testé !!). La création de dépot svn est simple : il suffit d’aller dans un dossier réservé et de taper svnadmin create mon_depot

Veillez à bien prendre en compte les droits de l’utilisateur : pour un dépôt auquel on accède par http, il faut que ce soit autorisé à l’utilisateur du processus apache (www-data sous debian).

La création de dépôt ne se fait qu’une fois pour tout le projet.

L’accès au dépôt se fait de différentes manières :

  • Par fichier sur la machine locale : file :///home/guillaume/svn/mon_depot (la subtilité étant la possibilité de mettre une clef usb lorsque l’on n’a pas de réseau)
  • Par internet lorsque apache est configuré avec davsvn : https//svn.monserver.truc/projectsvn
  • Par service svn ou svn+ssh : svn+ssh :///serverlabo/chez_moi/repos_svn

Import et checkout

Arborescence de base Lorsque l’on met un document de type latex sous gestionnaire de version pour son travail personnel, il n’y a pas trop à chercher pour savoir comment on va organiser le dépôt. Mais lorsque l’on veut travailler à plusieurs, ou pouvoir garder des versions stables, c’est plus compliqué.

SVN ne donne pas d’architecture de base pour les dossiers. Mais il est usuel de faire 3 dossiers dans un repos :

  • trunk : le tronc commun, c’est à dire le développement actuel (qui normalement devrait compiler et fonctionner avec quelques bugs)
  • branches : dossier comprenant les copies du trunk pour un développement poussé, c’est ici que les développeurs ajoutent de nouvelles fonctionnalités qui nécessitent un gros travail. Sous SVN, la copie ne prend en compte que les différences avec le trunk, économisant ainsi de l’espace mémoire sur le repository.
  • tags : les releases. Les versions fixes de programmes n’étant malheureusement jamais totalement débuggées (à cause de la loi de murphy), le fait d’avoir une gestion de version sur les tags permet de faire les corrections.

La création de cette arborescence se fait en utilisant la fonction "svn mkdir".

Import : mettre le pré-projet dans la base

Lorsque l’on décide de mettre un projet sous gestionnaire de version, certains codes peuvent avoir été écrits. Il faut donc les installer dans la base. Pour cela, nous avons la fonction import :


svn import mon_dossier  nom_depot
avec mon_dossier comportant les fichiers du pré-projet et nom_depot, le répertoire dans lequel on peut les mettre.

Checkout : récuperer un projet en cours

Lorsque le projet a été installé dans la base de données, on doit le récupérer sur les ordinateurs de développement. C’est le principe de la commande checkout (co pour les intimes). Ce n’est que quand les fichiers sont récupérés par cette méthode qu’ils sont versionnés.


svn checkout nom_depot dossier_versionne
(Avec dossier_versionne le nom du dossier où l’on veut mettre le programme sous gestionnaire de version.)

Add, mkdir, et rm : ajouter, créer et effacer dossiers et répertoires Lorsque notre dossier est sous gestionnaire de version, on peut vouloir ajouter des dossiers ou des fichiers.

  • La commande mkdir permet de créer un nouveau dossier dans le projet svn mkdir mon_nouveau_dossier
  • La commande add permet d’ajouter des fichiers et des dossiers qui ne sont pas sous gestionnaire de version svn add mon_fichier_ou_dossier
  • La commande rm permet de supprimer des fichiers : svn rm mon_fichier_ou_dossier

Commit et update

Lorsque l’on a apporté des modifications au projet, ou lorsque quelqu’un d’autre en a fait, il convient de faire une communication avec le serveur pour être à jour ou que les autres le soient. En effet, svn, comme tout bon gestionnaire de version, ne travaille pas sous connexion permanente [1]. Il faut donc lui dire ’je veux mettre mon projet à jour’ ou ’je veux que le développement actuelle sur ma machine soit envoyé sur le serveur’. C’est le travail de commit et update :

  • Commit permet d’envoyer les mises à jour sur le serveur : dans le dossier versionné, faire : svn commit
  • Update permet de mettre à jour notre dossier versionné : svn update

Le conflit de versions

Lorsque l’on fait un update alors que l’on a modifié des choses en local par rapport à la dernière version du serveur, on peut arriver à un conflit : Notre fichier est recopié (avec un .mine), le fichier qui est envoyé est recopié (avec un .rn°version .r42 par ex) et dans le fichier normal, certaines lignes sont rajoutées qui mettent en exergue la différence entre les 2 fichiers. A ce moment, il est impossible de faire un commit : il faut d’abord résoudre le conflit :

  1. Faire la résolution : éditer son fichier, et trouver ce qui cloche.
  2. Annoncer à svn que le conflit est résolu : svn resolved mon_fichier_conflictuel
  3. On peut faire le commit

Diff

Le diff permet de voir la différence entre 2 versions. Le plus simple emploi de diff consiste à envoyer la différence sur un programme comme kdiff3 : svn diff -r 41:42 superfichier.cpp --diff-cmd=kdiff3

Copy, move, switch

  • La fonction copy permet de faire la copie d’un dossier. Il faut noter qu’une branche est une copie du tronc : il faut la créer avec cette fonction.
  • La fonction move permet de déplacer un dossier ou un fichier
  • La fonction switch permet de changer la copie locale de branche

Merge

La fonction merge permet de mettre dans une branche les modifications qui ont été effectuées dans une autre branche entre différentes versions. Le cas usuel est lorsqu’un fichier à été modifié dans une branche, et que l’on veut le mettre à jour dans une autre branche (branche qui peut être le trunk bien entendu).

Pour l’appliquer, il faut se mettre dans le répertoire que l’on veut mettre à jour [2] :


 svn merge -r RevisionInitiale:HEAD (ou révisionfinale si différente de la dernière)  nom_du_fichier_ou_du_dossier (avec chemin)

Une autre technique consiste à utiliser l’outil ’svnmerge’ qui fait partie des contributions (les développeurs svn sont probablement en train de travailler sur une technique pour facilier les commits [3]).

Revert

Permet de retrouver la situation du dernier update : on annule les modifications locales. svn revert mon_fichier

Status, propset

Pour savoir quel est l’état du dépôt, il faut utiliser svn status. Cela permet de détecter les conflicts. Les commandes svn log et svn info sont aussi intéressantes.

Pour mettre de manière lisible à tous quel est la dernière personne qui à modifié un fichier, il est intéressant d’utiliser le tag $Id$ et la fonction propset :

  1. Dans notre programme, on met un commentaire contenant ’$Id$’
  2. On sort du programme et on donne à svn l’ordre de prendre ce tag en compte : svn propset  svn:keywords Id mon_fichier

Les petits trucs

  • Si certaines fichiers ont été modifié de manière erronnée, on peut les effacer de manière normale par erreur. Il suffit de faire ’svn update’ pour retrouver la dernière version. Si les fichiers n’ont pas été effacés, il vaut mieux utiliser la fonction revert.
  • La commande svn help macommande permet d’avoir de l’aide et des informations
  • Utilisation de la fonction ’svnmerge’ : (voir les sources)

Sources

svn tips

svnmerge

Encore svnmerge (tuto en anglais)

Le site de subversion

Et le livre de subversion

[1] J’aurais aimé être sur que ces précisions sont totalement inutiles. Mais en cas de doute, il faut parfois s’abstenir.

[2] Voire les trucs pour de plus amples informations

[3] voire par exemple l’article sur linuxfr


Accueil du site | Contact | Plan du site | Espace privé | visites : 50509

RSS RSSfr

Site réalisé avec SPIP 1.8.3 + ALTERNATIVES