Nous allons nous interresser ici aux commandes CVS client en mode texte. L'objectif n'est pas de connaître l'utilisation de ces commandes mais leur synthaxe explique le fonctionnement des interactions entre le client et le serveur.

 

Connexion au serveur CVS :

Pour toutes les interactions entre un client et un serveur il est souhaitable d'initialiser la variable $CVSROOT qui contiendra le chemin d'accès au serveur via le réseau. Cette variable permet d'éviter de saisir -d <chemin> dans chaque commande cvs pour lui spécifier où se trouve le référentiel.
export CVSROOT=':pserver:username@server-cvs:/rep_racine' dans le cas d'une connexion pserver
export CVSROOT='username@server-cvs:/rep_racine' et export CVS_RSH='ssh' dans le cas d'une connexion SSH.

Interactions avec le serveur :

cvs login : lorsque la variable $CVSROOT a été correctement initialisée, la commande cvs login doit permettre au client de se connecter au serveur et demander alors le mot de passe correspondant au username contenu dans la variable $CVSROOT. Le client crée alors le fichier ~/.cvspass qui contiendra le mot de passe (crypté) envoyé à chaque communication avec le serveur dans le cas d'une communication pserver.

cvs logout : la commande cvs logout permet de se deconnecter sur serveur et efface le mot de passe du fichier ~/.cvspass sans supprimer le fichier

cvs checkout (ou co) -z<niveau de compression> <module> : par cette commande, on demande au serveur une copie du module que l'on va stocker sur la machine client. Un sous-répertoire portant le nom du projet que l'on vient d'importer va être créé dans le répertoire dans lequel a été exécutée la commande. Un second répertoire nommé CVS est créé, il contient les informations de connexion au serveur CVS. Il ne doit pas être modifié. L'option -z avec une valeur accolée comprise entre 0 et 9 spécifie le niveau de compression gzip à utiliser. Ce paramètre optionnel peut être utilisé lors de transferts sur un réseau bas débit.

cvs diff : permet de comparer la version contenue dans la copie locale avec celle contenue sur le serveur. Il est possible de réaliser trois types de comparaisons d'un fichier :
- entre la version locale et la version actuelle du référentiel : cvs diff <nom de fichier>
- entre la version locale et une version identifiée du référentiel : cvs diff -r <identificateur de version> <nom de fichier>
- entre deux versions identifiées du référentiel : cvs diff -r <identificateur de version1> -r <identificateur de version2> <nom de fichier>

cvs add -m "Commentaure" <nom_fichier> <module> : permet d'ajouter le fichier nom_fichier et le module précisé au référentiel. Même si CVS ne gére pas les fichiers binaires, il est toutefois possible d'ajouter des fichiers binaires au référentiel par le paramètre -kb donné en ligne de commande avant le nom du fichier.

cvs remove <fichier> : L'exécution de cette commande n'est possible que si le fichier a été supprimé de la copie locale par un rm fichier. Elle permet de supprimer un fichier du référentiel. Quant à la suppression d'un répertoire, elle n'est possible que si le répertoire est vide.

cvs update <nom de module> ou <nom de fichier>: Cette commande permet de récupérer les modifications que les autres utilisateurs ont envoyé vers le serveur. Son utilisation suppose que l'utilisateur a déjà fait un checkout depuis le serveur et possède donc une copie du projet sur sa machine locale. Si aucun nom n'est passé en paramètre, CVS met à jour le module correspondant au répertoire dans lequel on se trouve.

Chaque mise à jour est suivie d'un compte rendu repéré par une lettre :

Lettre Signification
U Fichier local identique à celui du référentiel
A Import d'un nouveau fichier dans la copie locale
R Fichier supprimé dans la copie locale
M Fichier de la copie locale modifié
C Fichier du référentiel en conflit avec le fichier local
? Fichier local sans correspondance dans le référentiel

cvs commit (ou ci) -m "Commentaire" <fichier> <module> : mise à jour de la copie locale vers le référentiel. En l'absence du paramètre fichier, cvs détecte automatiquement les fichiers à mettre à jour pour le module donné. En cas d'omission du module, cvs prendra comme module celui dans lequel on se trouve dans l'arborescence locale. Si on ne passe par -m "Commentaire", l'éditeur par défaut pointé par la variable $CVSEDITOR s'ouvrira pour la saisie du commentaire. En cas de confilt, il convient de réaliser un cvs update afin d'importer les modifications faites entre le checkout et le commit par un autre utilisateur.

Chaque mise à jour est suivie d'un compte rendu repéré par une lettre :

Lettre Signification
P MAJ OK. Le fichier a été ajouté au référentiel ou modifié depuis le dernier update mais la copie locale ne l'avait pas modifiée
U MAJ OK. La copie locale avait modifié le fichier et personne d'autre.
M MAJ OK. Deux personnes ont modifié le fichier simultanément mais pas les mêmes portions de code.
C MAJ NOK. Deux personnes ont modifié les mêmes portions de code d'un fichier.

 

Après l'éxécution d'un commit et avant de quitter le projet il est bon de remonter au répertoire précédent et de réaliser un cvs release <repertoire du projet> qui vérifiera si tous les changements ont bien été mis à jour sur le référentiel.

Renommer un fichier sur le référentiel : il n'existe pas de commande apropriée, on doit passer par un add / remove après avoir éxécuté un mv sur la machine locale :
mv fic1 fic2
cvs add fic2
cvs remove fic1
cvs commit -m "On renomme fic1 en fic2"
: mise à jour automatique du référentiel à partir du module dans lequel on se trouve.

Revenir à une version précédente d'un fichier : en cas de problème il peut être nécessaire de revenir à une version antérieure de la source présente sur la machine locale. On fait alors appel au référentiel :
- cvs update -A <nom de fichier>
- rm <nom de fichier>
- cvs update -p -r <référence de version> <nom de fichier> > <nom de fichier>

cvs tag : la commande tag permet de spécifier un nom àune certaine version d'un fichier ou d'un projet permettant ainsi de revenir facilement à une version entièrement opérationnelle sans avoir à faire des recherches fastidieuses de l'origine du dysfonctionnement.
cvs tag <nom de version> taggera recursivement tout le répertoire avec le nom passé en paramètre. Pour tagger un fichier unique on passera le nom du fichier en dernier paramètre.
cvs status -v <nom de fichier> permet de voir le ou les tags posé(s) sur le fichier donné.
Enfin, la récupération d'un projet taggé se fait de la façon suivante : cvs checkout -r <nom de version> <nom de projet>.

Historique des modifications : cvs permet d'afficher l'historique des différentes modifications qu'a subi un fichier.
$ cvs log fichier
Cette commande peut être combinée avec une date ou un intervalle temporel:
$ cvs log -d "d" fichier
$ cvs log -d ">d" fichier
$ cvs log -d "<d" fichier
$ cvs log -d "d1<d2" fichier

Ces instruction donne l'historique respectivement de:
du jour d
après le jour d
avant le jour d
entre les jours d1 et d2
Le format des dates est:
yyyy-mm-dd: une date précise
yesterday: hier
last (week|month|year): la semaine dernière, le mois dernier, l'an passé
xx (jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec) yyyy: un jour précis de l'année (nom des mois au format anglais)

cvs annotate <nom de fichier> : affiche la liste des commentaires saisis lors des mises à jour successives du fichier donné ainsi que l'auteur et la version associée.

cvs status <nom de fichier> : renseigne sur l'état d'un fichier, si il doit être mis à jour vers le serveur ou depuis le serveur par exemple

Administration du serveur :

cvs import -m "nom CVS" /home/projet Recup Vo : cette commande permet d'ajouter le projet contenu dans /home/projet au référentiel CVS sous le nom nom CVS.

cvs checkout (ou co) nom_rep : réalisation d'une copie temporaire dans nom_rep du référentiel.

cvs admin : C'est par cette commande que l'on peut :
- mettre en place les "yeux" ("advisory locks") permettant à un utilisateur d'être averti dès lors qu'une mise à jour intervient sur un module donné.
- mettre en place des verrous ("exclusive locks") qui permettent à un utilisateur de verrouiler un fichier tant qu'il n'aura pas mis sa version à jour. Ce style de fonctionnement rend alors CVS équivalent à RCS.

Sauvergarde du référentiel : Lorsque l'administrateur souhaite réaliser une sauvegarde du référentiel (par copie dans un autre répertoire de la machine serveur), il est impératif que personne n'intervienne en modification au même moment. Pour ce faire, il est possible de verrouiller le serveur par l'insertion d'un fichier vide nommé #cvs.rfl dans chaque répertoire du référentiel.

Pour les autres commandes, man cvs;-).