CVS, acronyme de Concurrent Versions System ou de Concurrent Version System ou de Concurrent Versioning System, est un logiciel libre (licence GPL) de gestion de versions. Il est très utilisé dans le domaine du logiciel libre. Il peut aussi bien fonctionner en mode ligne de commande, qu'à travers une interface graphique.
Il suffit d'installer le paquet cvs.
Ce logiciel peut fonctionner en local (repository CVS local) ou en mode client-serveur (repository CVS distant). Dans les deux cas, un repository de travail, toujours situé localement, contient un ou plusieurs modules qui est le reflet du repository CVS. Un module est constitué d'une hiérarchie de fichiers versionnés. La localisation du repository CVS est définie dans la variable d'environnement $CVSROOT.
CVS offre principalement les opérations suivantes :
* admin : Administrer le repository (dans le cas d'une utilisation multi-utilisateurs)
* checkout : Obtenir une copie locale des fichiers
* commit : Envoyer ses modifications
* update : Mettre à jour le repository de travail par rapport au repository CVS
* diff : Voir les modifications entre les versions
* log : Voir les commentaires sur les différentes versions
* import : Créer un nouveau module dans le repository CVS à partir d'un répertoire local
* status : Voir le status d'un fichier ou d'un module
* tag : Poser une marque de révision ou de branche sur un fichier ou sur le module
* add/remove : Ajouter/Supprimer un fichier ou un module
L'aide en ligne de chaque commande est accessible au moyen de la commande : $ cvs —help <commande>
cvs --help checkout
Usage:
cvs checkout [-ANPRcflnps] [-r rev] [-D date] [-d dir] [-j rev1] [-j rev2] [-k kopt] modules... -A Reset any sticky tags/date/kopts. -N Don't shorten module paths if -d specified. -P Prune empty directories. -R Process directories recursively. -c "cat" the module database. -f Force a head revision match if tag/date not found. -l Local directory only, not recursive -n Do not run module program (if any). -p Check out files to standard output (avoids stickiness). -s Like -c, but include module status. -r rev Check out revision or tag. (implies -P) (is sticky) -D date Check out revisions as of date. (implies -P) (is sticky) -d dir Check out into dir instead of module name. -k kopt Use RCS kopt -k option on checkout. (is sticky) -j rev Merge in changes made between current revision and rev.
(Specify the —help global option for a list of other help options)
Le checkout est l'opération qui consiste à extraire les fichiers à partir du repository CVS et à les recopier dans le repository de travail. CVS extrait par défaut la dernière version du fichier de la branche principale appelée encore "tronc". Si plusieurs branches de développement sont en cours ou que vous voulez une version plus ancienne du "tronc", vous devez le spécifier à CVS au moyen du nom du tag de branche ou de révision (option -r).
Vous devez spécifier en argument le ou les fichiers ou répertoire que vous voulez extraire. Par exemple :
cvs checkout [-r <tag>] <nom_de_fichier> | <nom_de_répertoire>
Notez que l'utilisation de checkout est récursive.
Si tout se passe bien, CVS fournit une sortie qui ressemble à :
U htdocs/actions/ldd/index.wml
et crée un répertoire htdocs/actions/ldd contenant le fichier index.wml ainsi qu'un répertoire CVS qui contient des fichiers administratifs et qu'il convient d'ignorer (mais de ne pas effacer). Vous pouvez maintenant travailler sur le fichier index.wml.
Le commit est l'opération inverse. Le but du jeu est de mettre à jour dans le repository CVS et à partir du repository local le(s) fichier(s) ou le module complet que vous avez modifiés. Par exemple :
cvs commit <nom_de_fichier> | <nom_de_répertoire>
Notez que l'utilisation de commit est récursive.
CVS demande ensuite de rentrer des informations sur la nature des modifications effectuées (afin d'archiver leur trace dans un format facilement compréhensible par des humains). Par défaut, CVS exécute la commande vi, mais cette commande peut être modifiée au besoin en affectant le nom d'un éditeur de texte quelconque à la variable $EDITOR (par exemple emacs).
Enregistrez le texte de vos descriptions que vous venez de saisir (sous vi, ESC :x), et ensuite CVS mettra à jour vos modifications dans le repository. Notez que si vous mettez à jour plusieurs fichiers en même temps, CVS vous demandera certainement plusieurs descriptions pour vos modifications (vous pouvez mettre les mêmes).
Si votre description tient en quelques mots, vous pouvez vous passer de l'étape emacs/vi en mettant votre texte sur la ligne de commande, en utilisant l'option -m
cvs commit -m "Ajout du mois de mai" <nom_de_fichier>
La commande update permet de récupérer sur sa copie locale les modifications effectuées par d'autres personnes. Par exemple, pour recevoir toutes les modifications :
cvs update
Un conflit peut survenir si un fichier modifié localement a aussi été modifié par un autre utilisateur, qui en a fait un commit. Dans ce cas, CVS réunit les versions dans un fichier qu'il faut alors "merger" (résoudre les conflits).
La commande diff, liste les différences entre la version locale d'un fichier et celle qui se trouve actuellement sur le référentiel.
cvs diff <nom_de_fichier>
Il apparaît aussi utile de pouvoir comparer le fichier actuel avec une révision antérieure particulière :
cvs diff -r 1.5 -r 1.6 <nom_de_fichier>
Log permet de lister un historique sommaire des révisions comprenant les dates et numéros respectifs, ainsi que les commentaires spécifiés lors du commit (option -m ou saisis depuis l'éditeur appelé par cvs), utiliser la commande :
cvs log <nom_de_fichier>