Introduction
Cette note contient les informations minimales pour créer un référentiel CVS, ajouter, détruire ou modifier des fichiers, obtenir l'historique des modifications et extraire une version du référentiel. Il n'est pas exhaustif.CVS : pourquoi gérer des versions
Développer un projet qui incorpore plusieurs fichiers se révelle rapidement problématique au fur et à mesure où ce nombre de fichiers différents augmente, ou si plusieurs intervenants participent à ce projet. CVS permet d'avoir une gestion cohérente du projet, de pouvoir extraire une version donnée à jour tout en économisant l'espace disque puisque l'on peut gérer l'avancée du projet par deltas.CVS est en développement depuis 1986 (créé par Dick Grune).
Premier contact
Les exemples donnés ci-dessous ont été faits sous linux en ksh et fonctionnent dans le cas du développement sur une même machine. Il est possible de faire ses développements en réseau, et dans ce cas il faudra en plus instancier une variable CVS_RSH=ssh par exemple (et donner les droits nécessaires).
TEST CVS >cvs Usage: cvs [cvs-options] command [command-options-and-arguments] where cvs-options are -q, -n, etc. (specify --help-options for a list of options) where command is add, admin, etc. (specify --help-commands for a list of commands or --help-synonyms for a list of command synonyms) where command-options-and-arguments depend on the specific command (specify -H followed by a command name for command-specific help) Specify --help to receive this message The Concurrent Versions System (CVS) is a tool for version control. For CVS updates and additional information, see the CVS home page at http://www.cvshome.org/ or Pascal Molli's CVS site at http://www.loria.fr/~molli/cvs-index.html TEST CVS > TEST CVS >whereis cvs cvs: /usr/bin/cvs /usr/share/cvs /usr/share/man/man5/cvs.5.gz /usr/share/man/man1/cvs.1.gz TEST CVS > |
Les fichiers du projets sont déposés sous le répertoire : /ref/essai/mes_fics Nous allons d'abord créer un répertoire pour le dépôt dans CVS : $CVSROOT/cvs_essai, puis lancer la commande d'initialisation du dépôt CVS. |
TEST CVS >export CVSEDITOR=/bin/vi #ou n'importe quel autre éditeur TEST CVS >export CVSROOT=/ref/ TEST CVS >mkdir $CVSROOT/CVSROOT TEST CVS >ls $CVSROOT CVSROOT essai TEST CVS >cd $CVSROOT TEST CVS >cvs init TEST CVS >ls $CVSROOT/CVSROOT Emptydir commitinfo,v cvswrappers,v loginfo notify taginfo verifymsg,v checkoutlist config editinfo loginfo,v notify,v taginfo,v checkoutlist,v config,v editinfo,v modules rcsinfo val-tags commitinfo cvswrappers history modules,v rcsinfo,v verifymsg |
La variable CVSROOT peut contenir plus d'informations sous la forme :user@nom-reseau:repertoire Les fichiers du projets vont être déclarés dans CVS (dans un répertoire $CVS_ROOT/cvs_essai que nos avons préalablement créé). Pour faire l'import, il faut d'abord se placer dans le répertoire où sont les fichiers à déclarer dans CVS (CVS balaie tous les répertoires à partir de là où vous êtes). |
TEST CVS >ls -l essai/mes_fics total 0 -rw-r--r-- 1 ref_do do 0 Nov 7 15:53 fic1.ksh -rw-r--r-- 1 ref_do do 0 Nov 7 15:53 fic2.ksh TEST CVS >cd essai/mes_fics |
On va ensuite lancer la commande d'import dans CVS |
TEST CVS >cvs import -m "Commentaire sur mon projet" $CVSROOT/cvs_essai mes_fics initial |
Ca y est, la première version des fichiers est entrée dans CVS. |
Gérer les modifications
La première version a été crée. Un nouveau développeur va intervenir sur le projet :Il lui faudra rappatrier les fichiers dans un répertoire à lui (/tmp dans l'exemple ci-dessus), faire les modifications nécessaires puis insérer ces modifications versionnées dans le référentiel CVS.
La première action va consister à faire une copie du référentiel en se plaçant dans /tmp.
TEST CVS > cvs checkout cvs_essai cvs checkout: Updating cvs_essai/mes_fics U cvs_essai/mes_fics/fic1.ksh U cvs_essai/mes_fics/fic2.ksh |
Pour l'exemple, on modifie le fichier fic1.ksh, puis on va demander à CVS de figer cette modification (commit). |
TEST CVS >cvs commit fic1.ksh CVS: ---------------------------------------------------------------------- CVS: Enter Log. Lines beginning with `CVS:' are removed automatically CVS: CVS: Modified Files: CVS: fic1.ksh CVS: ---------------------------------------------------------------------- Modification de Ph.R. sur le fichier fic1.ksh Checking in fic1.ksh;312C written /ref_do/cvs_essai/mes_fics/fic1.ksh,v <-- fic1.ksh new revision: 1.2; previous revision: 1.1 done |
Le fait de ne pas donner de nom de fichier (on a passé ici fic1.ksh), va obliger CVS à examiner tous les fichiers connus pour voir s'ils ont été modifiés. Par ailleurs, pour éviter d'ajouter à chaque fois un label expliquant les modifications effectuées, il est possible de le renseigner pour tous les fichiers en utilisant l'option -m : cvs commit -m "Label des modifications effectuées" Si entre temps, un autre utilisateur a fait une mise à jour, CVS va indiquer qu'il y a un conflit. Il est possible d'ajouter un nouveau fichier (ou d'un retirer un). Après avoir créé nouveau.ksh, on tape les commandes de mise à jour |
TEST CVS >cvs add -m "nouveau fichier" nouveau.ksh TEST CVS >cvs commit TEST CVS >cvs remove nouveau.ksh TEST CVS >cvs commit |
Le suivi des modifications
Développer et historiser est une chose, mais l'important pour le chef de projet est de pouvoir avoir une vision globale de l'avancée du projet.
L'historique des modifications est récupérable par l'argument log de CVS. |
TEST CVS >cvs log cvs log: Logging . RCS file: /ref/cvs_essai/mes_fics/fic1.ksh,v Working file: fic1.ksh head: 1.2 branch: locks: strict access list: symbolic names: initial: 1.1.1.1 mes_fics: 1.1.1 keyword substitution: kv total revisions: 3; selected revisions: 3 description: ---------------------------- revision 1.2 date: 2005/11/08 10:42:53; author: PRI; state: Exp; lines: +1 -0 Modification de Ph.R. sur le fichier fic1.ksh ---------------------------- revision 1.1 date: 2005/11/07 16:07:42; author: PRI; state: Exp; branches: 1.1.1; Initial revision ---------------------------- revision 1.1.1.1 date: 2005/11/07 16:07:42; author: PRI; state: Exp; lines: +0 -0 Commentaire sur mon projet ============================================================================= RCS file: /ref_do/cvs_essai/mes_fics/fic2.ksh,v Working file: fic2.ksh head: 1.1 branch: 1.1.1 locks: strict access list: symbolic names: initial: 1.1.1.1 mes_fics: 1.1.1 keyword substitution: kv total revisions: 2; selected revisions: 2 description: ---------------------------- revision 1.1 date: 2005/11/07 16:07:42; author: PRI; state: Exp; branches: 1.1.1; Initial revision ---------------------------- revision 1.1.1.1 date: 2005/11/07 16:07:42; author: PRI; state: Exp; lines: +0 -0 Commentaire sur mon projet ============================================================================= RCS file: /ref_do/cvs_essai/mes_fics/Attic/nouveau.ksh,v Working file: nouveau.ksh head: 1.2 branch: locks: strict access list: symbolic names: keyword substitution: kv total revisions: 2; selected revisions: 2 description: nouveau ---------------------------- revision 1.2 date: 2005/11/08 11:10:32; author: PRI; state: dead; lines: +0 -0 plus de fichier nouveau.ksh ---------------------------- revision 1.1 date: 2005/11/08 10:57:35; author: PRI; state: Exp; deuxieme modif |
On voit sur cette exemple qu'il est important de se mettre d'accord sur une normalisation des commentaires pour un meilleur suivi du projet. Il peut être également nécessaire de filtrer l'affichage en indiquant une date, un fichier, auteur. |
TEST CVS >cvs log -d ">2005-11-30" nouveau.ksh TEST CVS >cvs log -wPRI |
L'extraction d'une version
Pour extraire une version et en faire un livrable, il va falloir la marquer, puis l'extraire.
TEST CVS >cd $CVSROOT cvs rtag "LivrableV1" cvs_essai TEST CVS >cd /repertoire_extraction cvs export -r "LivrableV1" cvs_essai |
Le répertoire /repertoire_extraction/cvs_essai contient une version complète de tous les fichiers marqués "LivrableV1" et débarrassée des fichiers de gestion de CVS (les ",v"). Elle peut être empaquetée pour être déployée. Une fois posé, un tag peut être réutilisé pour les commandes comme "cvs update -r LivrableV1" par exemple. |
Conclusions sur CVS
CVS offre des fonctionnalités simples qui permettent de gérer a minima l'évolution d'un projet après une prise en main d'une journée.Le logiciel mériterait cependant d'être plus intégré, en particulier sur le fait que certaines variables d'environnement sont importantes et peuvent empêcher le bon fonctionnent (un calcul de statut élémentaire et clair ne serait pas de trop) et plus encore, que les commandes fonctionnent parfois selon un positionnement absolu et parfois selon un positionnement relatif ; un contrôle minimum permettrait d'éviter quelques problèmes (un cvs init ou checkout mal placé par exemple).
Pour plus d'informations, je vous conseille les deux sites de référence suivant : Les informations fournies sont généralement claires, mais lorsque l'on part de zéro, j'ai du mal à comprendre pourquoi les rédacteurs ne présentent pas les commandes qu'il faut impérativement passer dans l'ordre où on doit les passer...