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 Repository ou de dépôt pour qualifier l'endroit où sont stockés les données de CVS ainsi que les données des utilisateurs.
  • de Working Directory ou répertoire de travail pour qualifier la version en cours de développement de la Repository.

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ù :

  • sysutils est le nom de l'arbre
  • ajoute le nom du créateur
  • initial le 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 add et cvs 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
 
doc/unix/projet_cvs.txt · Dernière modification: 2009/12/23 22:36 (édition externe)     Haut de page