Gestion des fichers d`un projet : CVS

Transcription

Gestion des fichers d`un projet : CVS
Gestion des fichers d’un projet : CVS
9 mai 2005
1
Introduction
Pour travailler en groupe sur un projet, le besoin d’un outil de partage de fichiers se fait assez
vite sentir. Ce que l’on recherche, c’est un moyen de :
– Mettre en commun un ensemble de fichiers sur une machine distante
– Pouvoir obtenir une copie de l’ensemble des fichiers du projet
– Pouvoir mettre à jour la version partagée à partir d’une version locale
– Pouvoir mettre à jour une version locale à partir d’une version partagée
– Gérer les invévitables conflits.
– Mémoriser les modifications pour pouvoir revenir sur des versions précédentes
L’outil que nous allons investiguer réalise toutes ces tâches. Il s’agit de CVS (Concurrent Version
System). De nombreux autres produits similaires existent, que ce soit dans le domaine OpenSource
(subversion, arch) ou dans le domaine commercial (clearcase). CVS reste l’outil le plus répandu,
malgrès quelques défauts que nous aborderons.
Le principe de CVS est de stocker non seulement les fichiers, mais également les modifications
faites entre deux versions d’un même fichiers. CVS permet alors à tout moment de reconstruire une
version particulière d’un fichier.
2
Architecture
CVS offre une architecture centralisée (pour une architecture répartie, on s’intéressera à arch).
Tous les fichiers d’un projet vont donc reposer dans un endroit unique, appelé dépôt ou repository
en anglais. Chaque dépôt CVS peut abriter plusieurs modules. Un modules peut correspondre à
un projet, ou bien à une sous partie d’un projet, suivant la granularité choisie. Une fois un dépôt
construit, il faut s’y connecter pour l’utiliser. CVS propose plusieurs moyen de connexion possible
entre la machine cliente (la machine d’un des membres du projet) et la machine serveur abritant le
dépôt :
accès direct les deux machines sont confondues
mode serveur pserver, gserver, kserver un démon cvsd écoute sur un port dédié les requêtes
des clients. Chaque version de serveur permet un type d’authentification différente.
accès en mode rsh/ssh : les manipulations sont effectuées en accès direct, mais par l’intermédiaire d’une connexion rsh/ssh.
1
Toutes les commandes cvs sont accessibles à partir du seul exécutable éponyme. L’exécutable
cvs utilise la variable d’environnement CVSROOT pour savoir quel est son dépôt de travail, ou bien
l’option -d de la commande. Dans ce TP, nous allons travailler en mode local (machines cliente
et serveur confondues). La seule variante pour les autres modes est la syntaxe de la définition de
CVSROOT.
3
Initialisation d’un dépot
Créez un répertoire qui sera votre dépôt cvs et intialiser la variable d’environnement CVSROOT à
cette valeur. Appelez ensuite la commande cvs init, qui créera un répertoire CVSROOT à l’intérieur
du répertoire spécifié, contenant les fichiers propres à la partie serveur de cvs.
$>mkdir ~/cvs
$>setenv CVSROOT ~/cvs
$>cvs init
$>cd ~/cvs
$>ls
CVSROOT
Toutes les commandes CVS que nous verrons utilisent cette variable d’environnement. L’alternative est d’utiliser l’option -d de la commande cvs pour spécifier la racine du CVS.
4
Utilisation de base
Nous allons passer en revue les différentes commande de CVS. Chaque commande CVS est de
la forme :
$> cvs [<options>...] <sous-commande> [<options sous-commande>...] [<noms fichiers>...]
Pour obtenir de la documentation :
$> cvs --help-commands
$> cvs --help-options
4.1
Création d’un nouveau projet
Créons d’abord un nouveau projet. Deux cas se présentent : un projet vide ou l’import d’un
projet existant.
Pour créer un nouveau projet sur le dépôt CVS à partir d’un répertoire existant, on se place
DANS le répertoire racine des sources du projet, et on exécute la commande cvs import.
$> cd /into/rep/sources
$> cvs import -m "Message stockée dans les logs cvs" nom_projet tag1 tag2
# verification :
$> cd /tmp
$> cvs checkout nom_projet
$> ls nom_projet
2
Nous aborderons la significations des tags plus tard. Sachez juste que cela permet d’identifier
par un nom plutôt que par un numéro une version particulière d’un fichier, ici la version initiale.
Pour partir d’un projet vide, il suffit de créer l’arborescence vide du projet et d’en faire un
import.
Comme exercice, répéter les commandes précédentes pour importer le contenu d’un de vos
projets dans le dépôt CVS créé ci-dessus.
4.2
Cycle de développement
Pour un des développeurs du projet, la vision est la suivante : il va créer une version locale du
projet à partir du dépôt (commande cvs checkout). Ensuite, il va utiliser ses outils habituels pour
modifier les fichiers de la version locale. Périodiquement, il va synchroniser sa copie locale avec le
dépôt, pour récupérer les modifications faites par les autres développeurs (commande cvs update).
Et enfin, il va reverser ses modifications dans le dépôt (commande cvs commit). Dans la version
locale, un répertoire CVS contient les informations sur les fichiers locaux ainsi que sur le dépôt. Par
défaut, un fichier ou un répertoire nouveau créé dans la copie locale n’est pas suivi par CVS. Pour
cela, il faut explicitement utiliser la commande cvs add.
En résumé, on sort d’abord les fichiers du dépôt pour les mettre dans un répertoire local, on les
modifie, puis on les remet dans le dépôt.
4.3
Création de la copie locale
Pour commencer à travailler, la première opération est de créer une copie locale des fichiers
d’un projet stocké dans un dépôt CVS. Pour cela, on utilise la commande cvs checkout. Cette
commande peut s’abréger en cvs co ou cvs get. Le seul argument nécessaire est le nom du module
que l’on souhaite charger. Un répertoire local est alors crée, portant le nom du module, et contenant
tous les fichiers de ce module. En outre, un répertoire CVS contient l’état des fichiers par rapport
au dépot.
$> cvs checkout nom_projet
Cette commande va consulter le répertoire nom_projet sur la machine et dans le répertoire
racine CVS indiqué par la variable d’environnement CVSROOT. Une fois la copie locale crée, placer
vous à l’intérieur du répertoire de plus haut niveau. Les commandes CVS ultérieure utiliseront les
informations contenus dans le répertoire CVS.
4.4
Mise à jour de la copie locale
La copie locale dérive avec le temps de la version centralisée sur le serveur. Pour incorporer les
modifications de la version commune dans la version locale, il faut utiliser la commande cvs update :
$> cvs update -dP
L’option -d demande à CVS de créer dans la copie locale les nouveaux répertoires qui ont été
rajoutés au dépôt, le comportement par défaut est de ne pas les créer. L’option -P supprime les
répertoires vide de la copie locale.
La commande cvs update est assez bavarde. Au niveau de la sortie, remarquez par exemple le
U nom_fichier signifiant que le fichier a été mis à jour.
3
4.5
Modification du dépôt
Vous pouvez modifier les fichiers de la copie locale avec vos outils habituels. Quand vous voudrez
incorporer vos modifications au dépot, il suffit d’utiliser la commande cvs commit.
$> cvs update -dP
$> cvs commit
Avant d’utiliser la commande cvs commit, il faut impérativement mettre sa copie locale à jour
avec les modification faites par les autres membres du projet, en utilisant la commande cvs update.
Cette commande va permettre de détecter les conflits éventuels entre vos modifications et celles des
autres développeurs. Nous traiterons des conflits un peu plus tard, et supposons pour le moment
que tout se passe bien.
Cette commande ouvre l’éditeur de texte pointé par la variable d’environnement CVSEDITOR, ou
par EDITOR si la première n’existe pas. Vous devez alors rentrer une description de vos modifications,
fichier par fichier que vous avez modifié.
4.6
Ajouter un document au pot commun
Pour rajouter une nouvelle ressource à la gestion CVS, il faut d’abord créer un fichier normalement. Ensuite, il faut spécifier explicitement que cette ressource doit être ajoutée à la copie CVS
locale. Pour cela :
$> cvs add Toto.java
Cette commande ajoute le fichier Toto.java à la copie locale. Il ne sera ajouté au dépôt qu’à la
prochaine validation (cvs commit).
Pour les répertoires, la commande à utiliser est la même. Par contre, la validation de la création
est implicite.
Faites attention, quand vous ajouter un fichier ou un répertoire dans le CVS, assurez vous que
toute l’arborescence parente menant à cette ressource a été également rajoutée au CVS.
4.7
Enlever un document du pot commun
L’opération de suppression se fait en deux temps. D’abord il faut supprimer le document de la
copie locale, puis informer CVS de cette suppression :
$> rm Toto.java
$> cvs remove Toto
Le fichier est alors marqué ”à supprimer” lors de la prochaine validation. A noter que CVS
gardera au niveau du dépôt toute l’historique du fichier, et qu’il sera donc possible de le récupérer.
La commande cvs remove est récursive, ce qui permet de marquer pour la suppression toute une
arborescence.
5
Signification des messages de CVS
Avant de s’intéresser à la gestion des conflits, regardons un peu plus avant la sortie de la commande cvs update. Pour utiliser un format allégé, vous pouvez rajouter l’option -q à la commande.
4
U fichier : la copie locale du fichier a été mise à jour
? fichier : fichier existant dans la copie locale mais pas dans le dépôt, et non gérés par CVS.
Typiquement des fichiers crées localement et qui n’ont pas été ajoutés grâce à cvs add.
A fichier : l’ajout de ce fichier au dépôt a été programmé.
M fichier : vous avez modifié ce fichier localement. CVS a pu incorporer les modifications provenant du dépôt sans générer de conflit.
R fichier : la suppression de ce fichier du dépôt a été programmée.
C fichier : vous avez modifié ce fichier localement. CVS a incorporé les modifications provenant
du dépôt, mais elles rentrent en conflit avec les votres.
6
Gestion des conflits
Qu’est-ce qu’un conflit ? CVS se repère à l’intérieur des fichiers textes par les numéros de ligne.
Si deux modifications ont été faites sur le même fichier par deux source différentes, alors il y a
conflit. CVS ne gère pas lui même les conflits, il ne fait que les signaler. CVS incorpore dans le
fichier créant le conflit les 2 modifications conflictuelles, entourées de balises ”==========”.
Le développeur doit alors résoudre manuellement le problème, puis valider la correction.
Exercice : créez volontairement un conflit. Pour cela, faites 2 copies locales du même module
d’un dépôt CVS. Modifiez un des fichiers dans la première copie, validez les modifications pour
les reverser dans le dépôt. Modifiez le fichier dans la 2e copie, et mettez à jour cette copie. La
commande cvs update doit signaler un conflit pour ce fichier. Editez alors le fichier, réglez le
problème et valider la modification.
A tout moment, la commande cvs status fichier permet de connaı̂tre l’état d’un fichier.
7
Définition de versions
De manière interne, CVS identifie les différentes versions des fichiers par des numéros de la
forme ”x.y.z”, avec plus ou moins de chiffres. Pour les versions successives, le dernier numéro est
incrémenté.
On peut également donner un nom à une version d’un fichier. Plus intéressant, on peut donner
le même nom à un ensemble de versions de fichiers, créant ainsi la notion de version au niveau du
projet tout entier.
Pour cela :
$> cvs tag nomDuTag nom
Ici nom désigne un fichier ou un répertoire. Dans le deuxième cas, le marquage sera récursif.
Pour voir les différents tags d’un fichier :
$> cvs status -v fichier
Pour créer une copie locale à partir d’une certaine version :
$> cvs checkout -r tag module
5
8
Création de branche séparées
Les premiers numéros de la version d’un fichier identifie la branche de développement. CVS peut
suivre en même temps plusieurs branches de développement/ Une utilisation commune de CVS est
de maintenir des branches séparées pour une version stable d’un projet et pour une version de
développement.
Pour créer une branche, on utilisera :
$> cvs tag -b stable
Cette commande crée la branche stable à partir des versions des fichiers de la copie locale.
$> cvs rtag -b -r tag stable module
Cette commande crée la branche stable dans le module module à partir de la version marquée
tag des fichiers.
Pour utiliser une branche spéciale :
$> cvs checkout -r stable module
Cette commande crée une copie locale à partir de la branche stable.
$> cd module
$> cvs update -r stable
Cette commande mets à jour une copie locale à partir d’une branche particulière.
9
CVS sous Eclipse
L’utilisation de CVS à partir d’Eclipse est assez facile. Une perspective (nom désignant sous
Eclipse une configuration spécifique de l’interface utilisateur) particulière est réservée à cet usage.
Pour l’obtenir, faire Window, Open a Perspective, Other, CVS Repository Exploring
Un clic droit sur la partie de gauche permet de lancer New, Repository Location. Remplissez
le formulaire qui apparaı̂t. Ce formulaire permet à Eclipse de récolter les informations nécessaires
pour la connexion à un dépôt cvs. Une fois le dépôt trouvé, vous pouvez créer un nouveau projet à
partir de n’importe quelle branche. Vous pouvez alors repasser à une perspective normale.
Dans la perspective normale, un menu est rajouté pour les fichiers sous contrôle CVS, permettant
les opérations de mise à jour et de validation.
10
Utilisation de CVS par SSH
Seule la syntaxe de CVSROOT change. Il faut également spécifier que l’on veut utiliser SSH
pour faire la connexion à la machine serveur (par défaut rsh est utilisé).
$> setenv CVS_RSH=ssh
$> setenv CVSROOT :ext:login@machine:/chemin/vers/cvsroot
6