Suivre un projet avec CVS
Auteur : Olivier BOYER - oboyer () ajoute ! org
Mots clés
cvs, dépôt, repository, unix, linux, BSD
Introduction
Ce document présente comment démarrer puis gérer simplement un projet avec CVS.
Ce document est loin d'être exaustif, mais il présente les commandes de base.
Présentation de la maquette
- administrateur du dépôt =
cvsadm:cvsadm, homedir =/home/cvsadm - emplacement du dépôt =
/home/cvsroot - nom du projet =
sysutils - répertoire de travail =
/tmp/devel/sysutils
Termes employés
Dans ce document, j'utilise les termes
- de
Repositoryou dedépôtpour qualifier l'endroit où sont stockés les données de CVS ainsi que les données des utilisateurs. - de
Working Directoryourépertoire de travailpour qualifier la version en cours de développement de laRepository.
Pré-requis
Ce document considère que :
- la commande
cvs, - le daemon
sshd, - le shell
ssh
sont installés sur le système et qu'ils fonctionnent convenablement.
Vous devez en outre possédez un compte utilisateur sur le système et connaître le mot de passe root.
Démarrer un projet
Créer un utilisateur d'administration du dépôt
Cette manipulation est à effectuer en tant qu'utilisateur root
# groupadd -g 602 cvsadm # useradd -m -d /home/cvsadm -s /bin/ksh -u 602 -g 602 cvsadm
/!\
A partir de maintenant, toutes les commandes suivantes, sauf mention contraire, sont à exécuter en tant qu'administrateur du dépôt (cvsadm).
/!\
Création du dépôt
Le propriétaire cvsadm a le droit d’écriture dans le dépôt ; les autres utilisateurs celui de lecture seule. Afin que les permissions du dépôt soient conforment à cette règle, il faut créer la Repository entant qu’utilisateur cvs.
Pour créer et initialiser la Repository, exécutez les commandes suivantes EN TANT QUE ROOT :
# mkdir /home/cvsroot # chown cvsadm:cvsadm /home/cvsroot # chmod 755 /home/cvsroot
Ces permissions s'appliquent à la rachine de la Repository, et par défaut à tous les projets en dessous. Pour permettre à un projet d'écrire dans le dépôt, il suffit de créer un nouvel utilisateur menbre du groupe cvsadm et de donner le droit d'écriture sur le répertoire du projet au groupe cvsadm.
Initialisation du dépôt
La commande cvs init permet d'initialiser la Repository.
Procédez comme suit :
$ cvs -d /home/cvsroot init $ ls -lR /home/cvsroot total 4 drwxrwxr-x 3 cvsadm cvsadm 1024 Dec 29 20:33 CVSROOT /home/cvsroot/CVSROOT: total 92 drwxrwxr-x 2 cvsadm cvsadm 512 Dec 29 20:33 Emptydir -r--r--r-- 1 cvsadm cvsadm 493 Dec 29 20:33 checkoutlist -r--r--r-- 1 cvsadm cvsadm 695 Dec 29 20:33 checkoutlist,v -r--r--r-- 1 cvsadm cvsadm 760 Dec 29 20:33 commitinfo -r--r--r-- 1 cvsadm cvsadm 962 Dec 29 20:33 commitinfo,v -r--r--r-- 1 cvsadm cvsadm 758 Dec 29 20:33 config -r--r--r-- 1 cvsadm cvsadm 960 Dec 29 20:33 config,v -r--r--r-- 1 cvsadm cvsadm 753 Dec 29 20:33 cvswrappers -r--r--r-- 1 cvsadm cvsadm 955 Dec 29 20:33 cvswrappers,v -r--r--r-- 1 cvsadm cvsadm 1025 Dec 29 20:33 editinfo -r--r--r-- 1 cvsadm cvsadm 1227 Dec 29 20:33 editinfo,v -rw-rw-rw- 1 cvsadm cvsadm 0 Dec 29 20:33 history -r--r--r-- 1 cvsadm cvsadm 1158 Dec 29 20:33 loginfo -r--r--r-- 1 cvsadm cvsadm 1360 Dec 29 20:33 loginfo,v -r--r--r-- 1 cvsadm cvsadm 1151 Dec 29 20:33 modules -r--r--r-- 1 cvsadm cvsadm 1353 Dec 29 20:33 modules,v -r--r--r-- 1 cvsadm cvsadm 564 Dec 29 20:33 notify -r--r--r-- 1 cvsadm cvsadm 766 Dec 29 20:33 notify,v -r--r--r-- 1 cvsadm cvsadm 649 Dec 29 20:33 rcsinfo -r--r--r-- 1 cvsadm cvsadm 851 Dec 29 20:33 rcsinfo,v -r--r--r-- 1 cvsadm cvsadm 879 Dec 29 20:33 taginfo -r--r--r-- 1 cvsadm cvsadm 1081 Dec 29 20:33 taginfo,v -rw-rw-rw- 1 cvsadm cvsadm 0 Dec 29 20:33 val-tags -r--r--r-- 1 cvsadm cvsadm 1026 Dec 29 20:33 verifymsg -r--r--r-- 1 cvsadm cvsadm 1228 Dec 29 20:33 verifymsg,v /home/cvsroot/CVSROOT/Emptydir: $
Voici un extrait de la page de manuel de cvs :
init Initialize a repository by adding the CVSROOT subdirec-
tory and some default control files. You must use this
command or initialize the repository in some other way
before you can use it.
Premiers ajouts de fichiers dans le dépôt
Supposons que tous les fichiers et répertoire à déposer ont pour racine : /tmp/devel/sysutils
Pour déposer votre arborescence dans la Repository CVS, exécutez la commande suivante :
$ cd /tmp/devel/sysutils $ cvs -d /home/cvsroot import -m "project creation" sysutils ajoute initial
Où :
sysutilsest le nom de l'arbreajoutele nom du créateurinitialle label de version. Le numéro de version cvs sera par défaut 1.1
La commande cvs commit ajoute les fichiers modifiés du répertoire courant dans le dépôt. Par défaut, ou si l’option –R est précisée, les fichiers présents dans les sous-répertoires sont aussi traités. L’option –l permet de limiter l’import des fichiers au répertoire courant (non récursif).
Une fois que le premier import a été réalisé, il faut supprimer le répertoire courant, et rapatrier (checkout) les fichiers que l’on vient d’importer. Le nouveau répertoire créé contient, en plus des fichiers initiaux, les répertoires CVS et CVSROOT qui contiennent les données relatives aux versions des fichiers.
$ cd /tmp/devel $ rm -Rf /tmp/devel/sysutils $ $ cvs -d /home/cvsroot checkout sysutils $ $ ls -l sysutils total 4 drwxr-xr-x 2 cvsadm cvsadm 512 Jan 20 17:00 CVS $
Maintenant, tous fichiers créés à partir du répertoire courant pourront être suivis en version dans le dépôt.
Commandes CVS de base
Dans cette section, il faut bien distinguer les commandes exécutées sur le répertoire local de celles exécutées sur le dépôt.
Placez vous à la racine du répertoire de travail, dans notre exemple : /tmp/devel/sysutils
$ cd /tmp/devel/sysutils
Exportez la variable d'environnement CVSROOT qui pointe à la racine du dépôt :
$ export CVSROOT=/home/cvsroot
Mettre à jour le dépôt
Après avoir modifié le répertoire de travail, exécutez la commande suivante :
$ cd /tmp/devel/sysutils $ cvs commit
Ajouter un fichier au dépôt
Prenons le cas d’un nouveau fichier créé dans le répertoire de travail. Pour indiquer à CVS qu’il doit prendre en compte l’évolution des versions de ce fichier, il faut exécuter la commande cvs add'.
Dans le cas contraire, lors du cvs commit, le nouveau fichier sera ignoré, et ne sera pas ajouté au dépôt. Regardons l’exemple suivant.
- Création du fichier :
$ pwd /tmp/devel/sysutils $ $ echo "Le contenu du premier fichier" > path/to/fichier.txt
- Ajout du fichier au dépôt :
$ cvs commit cvs commit: Examining . cvs commit: Examining path/to $
CVS n’a pas détecté la présence du nouveau fichier, le dépôt n’a pas été modifié. Analysons maintenant le comportement avec un cvs add :
$ cvs add path/to/fichier.txt cvs add: scheduling file `path/to/fichier.txt' for addition cvs add: use 'cvs commit' to add this file permanently $ $ cvs commit -m "Version Initiale" path/to/fichier.txt RCS file: /home/cvsroot/sysutils/path/to/fichier.txt,v done Checking in path/to/fichier.txt; /home/cvsroot/sysutils/path/to/fichier.txt,v <-- fichier.txt initial revision: 1.1 done $
Lors de l’exécution de la commande cvs add, CVS indique avoir pris en compte l’ajout du nouveau fichier. Pour que cet ajout soit répertorié dans le dépôt, il faut exécuter la commande cvs commit.
Il est possible de vérifier que le fichier ait bien été ajouté au dépôt :
$ cvs log path/to/fichier.txt RCS file: /home/cvsroot/sysutils/path/to/fichier.txt,v Working file: path/to/fichier.txt head: 1.1 branch: locks: strict access list: symbolic names: keyword substitution: kv total revisions: 1; selected revisions: 1 description: ---------------------------- revision 1.1 date: 2003/01/21 11:41:10; author: cvsadm; state: Exp; Version Initiale ============================================================================= $
Supprimer un fichier du dépôt
$ cd /tmp/devel/sysutils $ rm path/to/fichier.txt $ $ cvs remove path/to/fichier.txt cvs remove: scheduling `path/to/fichier.txt' for removal cvs remove: use 'cvs commit' to remove this file permanently $ $ cvs commit –m "commentaire"
Si vous oubliez de supprimer le fichier local avant d’exécuter le cvs remove, le message d’erreur suivant apparaît :
$ cd /tmp/devel/sysutils $ cvs remove path/to/fichier.txt cvs remove: file `path/to/fichier.txt' still in working directory cvs remove: 1 file exists; remove it first
Dans le dépôt, les fichiers supprimés sont déplacés dans le répertoire path/to/Attic
Supprimer un répertoire du dépôt
Avant de supprimer un répertoire du dépôt, il faut supprimer l’ensemble des fichiers qu’il contient. Pour ce faire, reportez-vous au paragraphe précédent.
Une fois tous les fichiers supprimés, procédez comme suit :
$ cd /tmp/devel/sysutils $ rm path/to/repertoire $ $ cd path/to $ cvs release -d <repertoire> You have [0] altered files in this repository. Are you sure you want to release (and delete) directory `repertoire': y
Le répertoire repertoire est supprimé du répertoire de travail.
Lire l'historique des logs d'un fichier
$ cd /tmp/devel/sysutils $ cvs log path/to/fichier.txt RCS file: /home/cvsroot/sysutils/path/to/fichier.txt,v Working file: path/to/fichier.txt head: 1.1 branch: locks: strict access list: symbolic names: keyword substitution: kv total revisions: 1; selected revisions: 1 description: ---------------------------- revision 1.1 date: 2003/01/21 16:15:03; author: cvsadm; state: Exp; test4 ============================================================================= $
Il est toujours possible de lire les logs d’un fichier supprimé, et de le réintégrer au répertoire de travail avec un cvs add.
Lire l'historique des commandes exécutées sur un fichier
CVS peux garder l’historique des commandes (checkout, commit, rtag, update, et release) exécutées sur un fichier du dépôt. L’enregistrement de l’historique des commandes est activé si le fichier $CVSROOT/CVSROOT/history existe.
$ cd /tmp/devel/sysutils $ cvs history -e path/to/fichier.txt O 2003-01-20 16:00 +0000 cvsadm sysutils =sysutils= /tmp/devel/* R 2003-01-21 11:02 +0000 cvsadm 1.2 fichier.txt sysutils/path/to == /tmp/devel/sysutils
La première lettre de chaque ligne indique la commande passée. Par exemple :
O le fichier a été téléchargé (''checkOut'')
U un fichier du répertoire de travail a été copié depuis le dépôt
P un fichier du répertoire de travail a été mis à jour (''Update'')
pour correspondre à celui du dépôt
Après un commit, il peut y avoir un des trois enregistrements suivants :
A le fichier a été ajouté (Added) pour la première fois M le fichier a été modifié (Modified) R le fichier a été supprimé (Removed)
Voir les différences entre les versions d'un fichier
Entre la version du dépôt et la version du répertoire de travail
$ cvs diff fichier.txt Index: fichier.txt =================================================================== RCS file: /home/cvsroot/sysutils/path/to/fichier.txt,v retrieving revision 1.4 diff -r1.4 fichier.txt 3a4 > encore une modification
La ligne encore une modification a été ajoutée au fichier
L’option -c de cvs diff permet d’afficher le contexte de la modification :
$ cvs diff -c fichier.txt Index: fichier.txt =================================================================== RCS file: /home/cvsroot/sysutils/path/to/fichier.txt,v retrieving revision 1.4 diff -c -r1.4 fichier.txt *** fichier.txt 22 Jan 2003 11:51:19 -0000 1.4 --- fichier.txt 22 Jan 2003 11:53:55 -0000 *************** *** 1,3 **** --- 1,4 ---- 3ere modification Ajout : Saut de ligne, et cette ligne + encore une modification $
L’option -u de cvs diff permet d’afficher les différences à la manière d’un diff(1) standard, et avec le contexte :
$ cvs diff -u fichier.txt Index: fichier.txt =================================================================== RCS file: /home/cvsroot/sysutils/path/to/fichier.txt,v retrieving revision 1.4 diff -u -r1.4 fichier.txt --- fichier.txt 22 Jan 2003 11:51:19 -0000 1.4 +++ fichier.txt 22 Jan 2003 11:53:55 -0000 @@ -1,3 +1,4 @@ 3ere modification Ajout : Saut de ligne, et cette ligne + encore une modification $
La première version du fichier est précédée du signe ‘-‘ ; la seconde du signe ‘+’ La version 1.4 du fichier contient 3 lignes ‘-1,3’ , la seconde 4 ‘+1,4’ La ligne ajoutée est : « + encore une modification »
Entre la version 1.3 et la 1.4
$ cvs diff -r 1.3 -r 1.4 fichier.txt
Historique complet de toutes les révisions
$ cvs annotate fichier.txt
Voir l'état d'un fichier par rapport au dépôt
$ cvs status fichier.txt =================================================================== File: fichier.txt Status: Up-to-date Working revision: 1.1 Tue Jan 21 15:53:56 2003 Repository revision: 1.1 /home/cvsroot/sysutils/path/to/fichier.txt,v Sticky Tag: (none) Sticky Date: (none) Sticky Options: (none)
Commandes CVS avancées
Déplacer et renommer des fichiers
$ cd path/to $ mv vieux_fichier.txt nx_fichier.txt $ $ cvs remove vieux_fichier.txt cvs remove: scheduling `vieux_fichier.txt' for removal cvs remove: use 'cvs commit' to remove this file permanently $ $ $ cvs add nx_fichier.txt cvs add: scheduling file `nx_fichier.txt' for addition cvs add: use 'cvs commit' to add this file permanently $ $ $ cvs commit -m "mv vieux_fichier.txt to nx_fichier.txt" vieux_fichier.txt nx_fichier.txt Removing vieux_fichier.txt; /home/cvsroot/sysutils/path/to/vieux_fichier.txt,v <-- vieux_fichier.txt new revision: delete; previous revision: 1.1 done RCS file: /home/cvsroot/sysutils/path/to/nx_fichier.txt,v done Checking in nx_fichier.txt; /home/cvsroot/sysutils/path/to/nx_fichier.txt,v <-- nx_fichier.txt initial revision: 1.1 done $
Déplacer et renommer des répertoires
[A FAIRE]
Quelques options CVS pratiques
cvs checkout
$ cvs checkout -q <projet>
quiet, n'affiche que les informations pertinentes.
cvs addetcvs commit
$ cvs add -m "<commentaire>" $ cvs commit -m "<commentaire>"
évite d'utiliser l'éditeur pour ajouter un commentaire
cvs add
$ cvs add -kb <fichier>
le fichier <fichier> ne sera pas pris en compte pendant le commit (utile pour les fichiers binaires …).
cvs log
$ cvs log -d "<date>" Exemple : $ cvs log -d "15 days ago" cvs.sgml $ cvs log -d "last month" cvs.sgml $ cvs log -d ">2000-4-1" <nom_de_fichier>
affiche les logs de modifications d’un jour donné.
$ cvs log -w<user>
affiche uniquement les logs de modifications de l’utilisateur user
cvs commit
$ cvs commit -r 2.0
force un saut à la version 2.0 (attention : pas de sauts en arrière)
Gérer un projet avec CVS
Maintenant que le projet est initialisé, et que les commandes cvs(1) sont familières, voyons comment utiliser cvs(1) pour gérer les versions de fichiers.
cvs add récursif
Par défaut les commandes de cvs sont récursives, sauf pour l’ajout (cvs add) et la suppression (cvs rm).
Le script cvsadd.sh permet de réaliser un cvs add récursif des fichiers et répertoires ajoutés au répertoire de travail.
Utilisation : cvsadd.sh </chemin/vers/repertoire_de_travail>
$ cvsadd.sh /tmp/devel/sysutils
Mettre à jour un arbre de sources
Le script cvsimport.sh détecte les nouveaux fichiers présents dans le répertoire de travail, les ajoute au dépôt, puis met à jour les fichiers déjà existants. Cela permet de suivre automatiquement les versions d’un répertoire de travail.
Utilisation : cvsimport.sh </chemin/vers/repertoire_de_travail> <commentaire>
$ cvsimport.sh /tmp/devel/sysutils test