BACK
C.V.S
Emacs
Euro
Fontes
FreeADSL
Index
Logiciels
Portable

CVS

Concurrent Version System est un utilitaire qui permet la gestion simultanée par plusieurs personnes des mêmes fichiers. Les indications données ici devraient permettre de guider les premiers pas de l'utilisateur novice de CVS.

Une aide en ligne est disponible par cvs --help puis cvs --help < option > CVS est en outre interfacé très efficacement avec emacs.

On peut distinguer quatre phases dans son utilisation :

Une liste des commandes de base est donnée ainsi qu'un bref aperçu des aspects client/serveur des nouvelles versions de CVS.


Installation

CVS gère une base de donnée qui contient tous les fichiers courants, et tous les fichiers des versions antérieures. Cette base de donnée est placée dans un répertoire particulier qui n'a rien à voir avec les répertoires dans lesquels les utilisateurs travaillent, mais ces utilisateurs doivent y avoir accès et pouvoir y écrire.

Pour pouvoir utiliser CVS, il convient de placer dans son fichier de configuration la commande suivante qui informe CVS de l'emplacement de la base de donnée grâce à une variable d'environnement. Cette variable pourra être initialisée dans le .profile ou .login :

  • avec un Bourne-shell ou dans le .profile
    CVSROOT= ~cvs/MasterCVS ; export CVSROOT
  • ou encore avec un C-shell, ou dans le .login ou .cshrc
    setenv CVSROOT ~cvs/MasterCVS

Initialisation

Supposons qu'Alice veuille partager son travail avec Bob, lequel travail est contenu dans son répertoire
~alice/boulot
  • Dans un premier temps elle précise le répertoire qu'elle veut faire gérer à CVS
    cd ~alice/boulot ; cvs import boulot boulot-0 boulot-0_0
    Les deux derniers noms doivent être différents et ne pas contenir de caractère '.' (ce qui est un peu ennuyeux pour des versions, mais bon...) L'éditeur de texte de la variable d'environnement $EDITOR est alors lancé (vi par défaut) afin d'entrer le premier commentaire de gestion de la base. En effet chaque nouvelle action sur la base demande l'entrée d'un commentaire (qu'on peut laisser vide) qui permet de retrouver plus facilement de vieilles versions ultérieurement. Une fois le message entré, tous les fichiers du répertoire boulot sont inclus dans la base automatiquement :
    N boulot/Makefile
    N boulot/h/foo.h
    N boulot/c/a.c
    N boulot/c/b.c
  • Alice efface alors son répertoire (ou plus prudemment le renomme !)
    mv boulot boulot.old

Cette initialisation n'est à effectuer qu'une seule fois.

Utilisation

Vient maintenant l'utilisation à plusieurs de la base. Les opérations qui suivent sont communes à tous les utilisateurs, y compris Alice.
  • Chaque utilisateur récupère le répertoire boulot par la commande
    cd ; cvs get boulot
    La première fois, le répertoire boulot est recréé avec tous les fichiers internes. La seule différence avec le répertoire boulot.old est l'apparition de répertoires CVS qui contiennent les informations sur la version en cours.
  • Chacun peut alors modifier à sa guise les fichiers de son répertoire boulot.
  • Lorsqu'un utilisateur (ici Bob) souhaite faire partager aux autres le fruit de son labeur il effectue la commande
    cd ~bob/boulot ; cvs commit
    Après entrée de son commentaire, la base est alors ajustée avec ses modifications.
  • Les autres utilisateurs peuvent récupérer les modifications effectuées par la commande
    cd ~alice ; cvs get boulot
    On observe alors quelque chose comme
    M boulot/h/foo.h
    C boulot/c/a.c
    U boulot/c/b.c
    U boulot/c/nouveau.c
    Cette commande n'écrase PAS leurs modifications personnelles. Toutes les modifications sont mergées, de sorte que l'opération est transparente pour l'utilisateur. Les fichiers qui apparaissent avec un M sont ceux qui ont été mergés. Les fichiers avec un U ont été mis à jour.
    Cependant, des conflits peuvent apparaître si les modifications ont été effectuées au même endroit du fichier. Ces fichiers sont indiqués par la lettre C. Le fichier correspondant comprend alors à l'endroit du conflit la juxtaposition suivante
    <<<<<<< a.c
    J'ai fait une modif, et j'ai fait get apres
    =======
    J'ai fait commit avant
    >>>>>>> 1.2
    et l'utilisateur devra modifier son fichier manuellement pour effectuer le merge.

Commandes

Voici les commandes de base utiles à connaître :
  • cvs add < fichier(s) > permet d'ajouter un nouveau fichier ou répertoire dans la base. Cette fonction n'est pas récursive. Si on souhaite ajouter l'ensemble des fichiers et répertoire d'un répertoire (par exemple lorsqu'on souhaite rajouter les sources d'une bibliothèque dans un développement en cours) on peut utiliser la commande suivante :
    cvs add [dir]; find [dir] -type d \! -name CVS -print -exec /bin/sh -c 'cd {}; cvs add *' \;
  • cvs commit ajuste la base de données avec le répertoire courant. Un cvs update doit être effectué avant tout.
  • cvs get récupère les modifications de la base de données par rapport au répertoire courant.
  • cvs remove < fichier(s) > permet de retirer un fichier de la base. Le fichier sera aussi retiré chez les autres utilisateurs.
  • cvs status < fichier > donne la situation actuelle du fichier ou du répertoire courant.
  • cvs update < fichier > met à jour le fichier ou le répertoire courant. Doit être effectué avant chaque cvs commit, mais
    ATTENTION, seul un cvs get permet de récupérer de nouveaux fichiers ajoutés par les autres utilisateurs. D'une manière générale, lorsqu'on effectue un cvs commit global, on a tout intérêt à effectuer auparavant un cvs get global.

Emacs

Sous emacs-19.3x, un fichier sous CVS apparaît avec la mention de sa version. Le menu Tools/Version Control/Show Other Version permet par exemple de visualiser toutes les versions du fichier. Le menu Tools/Compare/File with Revision permet de visualiser les modifications effectuées par rapport aux versions antérieures. D'autres possibilités sont offertes.

Exportation

Exportation simple

Lorsqu'une version particulière est atteinte, il peut être intéressant de la mémoriser, et éventuellement de la distribuer.
  • cvs tag version permet de tagger tous les fichiers avec version.
  • cvs export -r version boulot permet de fabriquer un répertoire avec la version taggée du répertoire boulot, sans répertoire CVS.
  • Pour exporter la version courante, faire cvs export -D today boulot, ce qui permet par exemple d'effectuer un archivage des fichiers.

Définition d'une branche de développement

Lors d'une exportation, il est souvent nécessaire de définir une branche de développement ; ceci permet de fixer les bugs de la version exportée tout en continuant un développement sur l'arbre standard. Bien entendu, les bugs fixés peuvent l'être automatiquement dans la branche standard de développement.
  • cvs tag -b version permet de tagger tous les fichiers en définissant la branche version.
  • cvs update -r version permet ensuite de mettre à jour la branche version.
  • cvs update -j version permet dans la branche principale de récupérer les modification de la branche version.

Comparaison

La commande cvs diff permet de comparer des arborescence cvs de manière récursive. Par exemple si on souhaite comparer la version de développement courante avec la branche de développement public définie lors d'une précédente release on pourra taper
cvs diff -r public > /tmp/diff
Le fichier /tmp/diff contiendra alors toutes les différences entre les fichiers. La commande cvs diff permet de comparer des arborescence cvs de manière récursive. Par exemple si on souhaite comparer la version de développement courante avec la branche de développement public définie lors d'une précédente release on pourra taper
cvs diff -r public > /tmp/diff
Le fichier /tmp/diff contiendra alors toutes les différences entre les fichiers.

Aspects client/serveur

Le système CVS peut désormais être utilisé en mode client/serveur. Le serveur tourne généralement sous Unix (même si des portages sous NT existent) et les clients sont soit sous Unix, soit sous Windows.
Les fonctions de base restent les mêmes. Les seules différences sont :
  • Le format de la variable CVSROOT change. On aura à la définir avec une commande du type
    setenv CVSROOT :protocol:login@server:/home/cvs/MasterCVS
    Le champ protocol peut prendre différentes valeurs en fonction de l'installation du serveur (liste non exhaustive, voir la documentation pour plus de détails) :
    protocol Type de serveur
    local Connexion locale (donc sans serveur). Dans ce cas, il n'y a pas de login@server. C'est le fonctionnement initial de CVS. La commande
    setenv CVSROOT :local:/home/cvs/MasterCVS
    est donc équivalente à la commande
    setenv CVSROOT /home/cvs/MasterCVS
    server Connexion utilisant le client rsh intégré.
    ext Connexion utilisant un client rsh externe précisé dans la variable d'environnement CVS_RSH. Ceci permet en particulier d'utiliser ssh.
    pserver Connexion utilisant un protocole à base de mot de passe pour la connexion. Ce protocole est peu sûr mais permet une connexion lorsque toute autre méthode ne fonctionne pas (problème de firewall bloquant le rsh ou non disponibilité de client rsh sur un autre OS par exemple).
    gserver Connexion utilisant un protocole sécurisé basé sur les GSSAPI, par exemple Kerberos 5.
  • Quelques commandes sont ajoutées qui interviennent selon les protocoles dans la connexion au serveur. Par exemple, pour le protocole pserver, le serveur doit être lancé avec la commande cvs pserver, tandis que le client se connecte par la commande cvs login et se déconnecte par cvs logout.


Bugs

  • CVS ne gère pas correctement les liens symboliques.
  • CVS ne peut fonctionner correctement si RCS n'est pas installé.
  • La séquence $Id est interprétée par CVS comme une variable d'identification du fichier. Cette séquence est donc automatiquement remplacée par la version du fichier, ce qui peut être génant.
BACK
C.V.S
Emacs
Euro
Fontes
FreeADSL
Index
Logiciels
Portable

Florent Chabaud
E-mail : florent.chabaud@m4x.org
Clé GPG : CLÉ