Utilisation de subversion (gestion de versions)

Xavier Crégut Prenom.Nom@enseeiht.fr

12 avril 2018

Installation de subversion (SVN)

sudo apt-get install subversion

Création d’une copie locale du dépôt (checkout)

svn co http://cregut.svn.enseeiht.fr/2017/dafs/$USER

Attention : $USER est à remplacer par votre identifiant ENSEEIHT, celui qui sert à se connecter sur Moodle, sur le portail captif pour accéder au réseau, etc.

Cette commande crée une copie locale du dépôt SVN en créant le dossier $USER. Faire ls pour le constater.

Remarque : On peut ajouter à la fin de la commande un nom de dossier qui deviendra la copie local du dépôt. Le fichier peut exister.

Ajouter des fichiers

Normalement, on ne met sur SVN que les fichiers sources et pas les fichiers qui peut être obtenus à partir d’autres.

Quand on veut ajouter un nouveau fichier, il faut le dire explicitement :

svn add fichier...

fichier… sera alors marqué comme à ajouter. Il n’est cependant encore que dans la copie locale du dépôt.

Supprimer un fichier (remove ou rm)

svn remove fichier...

Les fichiers seront supprimés localement et marqués comme devant être supprimés du dépôt.

Renommer un fichier (rename, ren, move, mv)

svn mv f1 f2

Renomme le fichier f1 en f2.

État des fichiers

Pour obtenir l’état de tous les fichiers du dépôt, faire :

svn status

Pousser les modifications locales vers le dépôt centralisé

svn commit -m 'Un message significatif'

Il faut bien sûr fournir un message qui explique les changements ont été faits.

Si on omet l’option -m, l’éditeur de texte (vi par défaut) sera appelé.

Remarque : Si on ne veut pousser que quelques fichiers, il suffit de les indiquer explicitement sur la ligne de commande.

Attention : Un commit ne peut être fait que si la version locale est à jours vis à vis du serveur. Si d’autres ont poussé leurs mofications, il faut d’abord les intégrer dans la copie locale du dépôt, résourdre les éventuels conflits et ensuite les pousser (voir points suivants).

Mettre à jour son dépôt local

Pour intégrer les modifications faites sur le serveurs par d’autres dans la copie locale du dépôt, il faut faire :

svn update

Remarque : SVN essaiera de fusionner les modifications s’il y a des modifications faites en local et sur le serveur. S’il n’y arrive pas, il signalera un conflit. La commande propose alors plusieurs choix.

Dans ce cas, le plus simple est de choisir ‘p’ (postpone). Le fichier sera alors marqué en conflit…

Résoudre un conflit

Un fichier en conflit ne peut pas être poussé. Les svn commit seront refusés. Il faut d’abord résoudre le conflit.

Il suffit d’éditer le fichier en conflit. SVN a ajouté des marqueurs pour montrer les différences entre la version locale du fichier (mine) et la version distante (identifiée par son numéro de version).

<<<<<<< .mine
    message = "bonjour";
=======
    message = "salut";
>>>>>>> .r32931

Il faut alors faire la fusion manuellement sous l’éditeur de texte. Par exemple, on garde la ligne avec “bonjour” et on supprime les autres :

    message = "bonjour";

Ceci étant fait, il faut dire à SVN que le conflit est résolu :

svn resolved fichier

On peut alors le pousser.

Différences entre la version locale et celle récupérée du dépôt

On peut savoir quelles sont les modifications faites par rapport à la dernière version récupérée du dépôt :

svn diff

Attention : Ceci ne donne pas les modifications par rapport à la dernière version du dépôt !

Accéder aux différentes versions

Les commandes

svn log

ou

svn log fichier

permettent de voir les dernières modifications du dossier courant ou du fichier donné en argument. Pour chaque modifications, le numéro de version, l’auteur, la date, etc. sont données. Le message fourni lors du ‘commit’ est aussi affiché.

Le numéro de version peut être utilisé comme option (-rxxx) de update, checkout, etc. pour récupérer une version précise, de diff pour comparer un le fichier locale avec la version correspondante, etc.

Conseils

Toujours penser à faire un ‘update’ avant de commencer à travailler sur ses fichiers pour être sûr de récupérer les dernières modifications qui auraient pu être faites et poussées par d’aures personnes.

Dans un gestionnaire de version, on ne met que les fichiers source et pas les fichiers qui peuvent être engendrés automatiquement (.o, exécutables, documentation engendrée, etc.).

Exemple d’utilisation de SVN

Chez Léa Sur le serveur SVN Chez Luc Commentaires
  1. vi fichier.txt
—- fichier.txt ————-
Ceci est le contenu du fichier
sur plusieurs lignes
——————————
Léa crée un nouveau fichier (fichier.txt)
  1. svn add fichier.txt
Léa indique à SVN de garder les version de fichier.txt
  1. svn commit -m “nouveau”
Léa pousse ses modifications sur le serveur.
—- fichier.txt ————-
Ceci est le contenu du fichier
sur plusieurs lignes
——————————
—- fichier.txt ————-
Ceci est le contenu du fichier
sur plusieurs lignes
——————————
fichier.txt est identique sur le serveur et chez Léa.
  1. svn update
Luc met à jour sa version locale
—- fichier.txt ————-
Ceci est le contenu du fichier
sur plusieurs lignes
——————————
—- fichier.txt ————-
Ceci est le contenu du fichier
sur plusieurs lignes
——————————
—- fichier.txt ————-
Ceci est le contenu du fichier
sur plusieurs lignes
——————————
fichier.txt est identique chez Léa, Luc et sur le serveur
  1. vi fichier.txt
  1. vi fichier.txt
Léa et Luc modifient leur copie locale de fichier.txt.
Léa a ajouté une ligne à la fin
Luc a ajouté une ligne au début
—- fichier.txt ————-
Ceci est le contenu du fichier
sur plusieurs lignes
Ligne ajoutée par Léa
——————————
—- fichier.txt ————-
Ceci est le contenu du fichier
sur plusieurs lignes
——————————
—- fichier.txt ————-
Ligne ajoutée par Luc
Ceci est le contenu du fichier
sur plusieurs lignes
——————————
Le fichier est différent chez Léa, Luc et sur le serveur.
  1. svn commit -m “ajout fin”
Léa pousse sa version sur le serveur.
—- fichier.txt ————-
Ceci est le contenu du fichier
sur plusieurs lignes
Ligne ajoutée par Léa
——————————
—- fichier.txt ————-
Ceci est le contenu du fichier
sur plusieurs lignes
Ligne ajoutée par Léa
——————————
—- fichier.txt ————-
Ligne ajoutée par Luc
Ceci est le contenu du fichier
sur plusieurs lignes
——————————
Le fichier est identique chez Léa et sur le serveur. Le fichier de Luc est différent.
  1. svn commit -m “ajout début”
Luc pousse sa version. La commande échoue car le fichier a changé sur le serveur. Il doit commencer par faire un update.
  1. svn update G fichier.txt
svn a réussi à fusionner les modifications. C’est ce qu’indique le ‘G’ devant le fichier.
—- fichier.txt ————-
Ceci est le contenu du fichier
sur plusieurs lignes
Ligne ajoutée par Léa
——————————
—- fichier.txt ————-
Ceci est le contenu du fichier
sur plusieurs lignes
Ligne ajoutée par Léa
——————————
—- fichier.txt ————-
Ligne ajoutée par Luc
Ceci est le contenu du fichier
sur plusieurs lignes
Ligne ajoutée par Léa
——————————
Le fichier est identique chez Léa et sur le serveur. Le fichier de Luc est différent mais intègre bien les modifications du serveur (celles faites par Léa)
  1. svn commit -m “ajout début”
Maintenant Luc peut pousser ses modifications.
—- fichier.txt ————-
Ligne ajoutée par Luc
Ceci est le contenu du fichier
sur plusieurs lignes
Ligne ajoutée par Léa
——————————
—- fichier.txt ————-
Ligne ajoutée par Luc
Ceci est le contenu du fichier
sur plusieurs lignes
Ligne ajoutée par Léa
——————————
—- fichier.txt ————-
Ligne ajoutée par Luc
Ceci est le contenu du fichier
sur plusieurs lignes
Ligne ajoutée par Léa
——————————
fichier.txt est identique chez Léa, Luc et sur le serveur
  1. vim fichier.txt
  1. vim fichier.txt
Léa ajoute un point après “lignes”.
Luc remplace “plusieurs” par “quatre”.
—- fichier.txt ————-
Ligne ajoutée par Luc
Ceci est le contenu du fichier
sur plusieurs lignes.
Ligne ajoutée par Léa
——————————
—- fichier.txt ————-
Ligne ajoutée par Luc
Ceci est le contenu du fichier
sur plusieurs lignes
Ligne ajoutée par Léa
——————————
—- fichier.txt ————-
Ligne ajoutée par Luc
Ceci est le contenu du fichier
sur quatre lignes
Ligne ajoutée par Léa
——————————
Les trois fichiers sont différents.
  1. svn commit -m “quatre”
Luc est le plus rapide à faire son commit.
—- fichier.txt ————-
Ligne ajoutée par Luc
Ceci est le contenu du fichier
sur plusieurs lignes.
Ligne ajoutée par Léa
——————————
—- fichier.txt ————-
Ligne ajoutée par Luc
Ceci est le contenu du fichier
sur quatre lignes
Ligne ajoutée par Léa
——————————
—- fichier.txt ————-
Ligne ajoutée par Luc
Ceci est le contenu du fichier
sur quatre lignes
Ligne ajoutée par Léa
——————————
Le fichier de Luc et celui du serveur sont identiques.
  1. svn commit -m “ponctuation”
Comme tout à l’heure, le commit échoue. Il faut commencer par faire un update.
  1. svn update
Léa a moins de chance que Luc. SVN n’a pas capable de fusionner les modifications. Elle choisit ‘p’ (postbon) et le fichier arrive en conflit chez elle. Elle devra régler le conflit avant de pouvoir faire le commit.
—- fichier.txt ————-
Ligne ajoutée par Luc
Ceci est le contenu du fichier
<<<<<<< .mine
sur plusieurs lignes.
||||||| .r126606
sur plusieurs lignes
=======
sur quatre lignes
>>>>>>> .r126608
Ligne ajoutée par Léa
——————————
—- fichier.txt ————-
Ligne ajoutée par Luc
Ceci est le contenu du fichier
sur quatre lignes
Ligne ajoutée par Léa
——————————
—- fichier.txt ————-
Ligne ajoutée par Luc
Ceci est le contenu du fichier
sur quatre lignes
Ligne ajoutée par Léa
——————————

Le fichier de Luc et celui du serveur sont identiques. Celui de Léa contient des marqueurs ajoutés par SVN qui indiquent les différences entre sa version et celle récupérée du serveur.

Après les =======, on a la version récupérée sur le serveur (version .r126608). Avant, on a la version locale, en précisant la version actuelle avant ||||||| et la dernière version récupérée du serveur avant le conflit (r126606).

  1. svn status
C fichier.txt
? fichier.txt.mine
? fichier.txt.r126606
? fichier.txt.r126608
Résumé des conflits :
  Conflits textuels : 1
Léa affiche l’état des fichiers.
—- fichier.txt ————-
Ligne ajoutée par Luc
Ceci est le contenu du fichier
sur quatre lignes.
Ligne ajoutée par Léa
——————————
—- fichier.txt ————-
Ligne ajoutée par Luc
Ceci est le contenu du fichier
sur quatre lignes
Ligne ajoutée par Léa
——————————
—- fichier.txt ————-
Ligne ajoutée par Luc
Ceci est le contenu du fichier
sur quatre lignes
Ligne ajoutée par Léa
——————————

C’est à elle de résoudre les conflits : elle garde son point et remplace “plusieurs” par “quatre”.

Attention à ne pas perdre ou écraser les modifications des autres.

  1. svn resolved fichier.txt
Conflit sur ‘fichier.txt’ résolu
Il faut dire que le conflit est résolu.
  1. svn commit -m “ponctuation”
Les modifications sont poussées sur le serveur.