CVS est l’abréviation pour " Concurrent Versions System ". Cet outil, LA principale référence dans son domaine, permet de suivre l’historique des fichiers de type " texte ". Il est donc particulièrement adapté pour la gestion des fichiers sources dans le cadre d’un développement coopératif.
C’est un logiciel libre sous licence GNU.
On peut affirmer que CVS est aujourd’hui devenu un standard du logiciel libre.
Le site officiel de CVS se trouve à l’adresse suivante : www.cvshome.org. Vous pourrez y télécharger la dernière version du produit (1.11.4 lors de la rédaction de ce document). Vous y trouverez également documentation (en anglais ) et forum de discussion.
Dans le cas qui nous intéresse, à savoir le développement d’un projet dans un cadre coopératif, CVS va nous permettre de conserver l’historique de toutes les modifications apportées aux fichiers sources.
CVS fonctionne sur le principe du client-serveur.
Sur le serveur se trouvent les originaux des fichiers sources de chaque projet. Ils sont stockés dans le référentiel (en anglais : repository).
Le développeur ne modifie jamais directement le référentiel. Il dispose d’une copie dans son environnement personnel ( ce répertoire propre peut d’ailleurs se trouver soit sur la même machine que le référentiel, soit sur une machine distincte capable de se connecter au serveur via un réseau ). Le développeur travaille donc dans son " bac à sable " ; quand il a terminé et testé ses modifications, il demande leur mise à jour dans le référentiel. CVS se charge alors automatiquement de mettre à jour le numéro de version de chaque fichier modifié.
En fait, l’outil conserve, pour chaque fichier, un historique des modifications et non pas les versions successives de chaque fichier, ce qui permet un gain de place évident. Ce fonctionnement est également très utile pour retrouver un bogue : si on connaît la dernière version où ce bogue n’apparaissait pas, il est possible de lister toutes les modifications apportées au fichier incriminé depuis cette version stable. Nous verrons plus loin, dans le corps de ce document, les différentes possibilités de CVS et les commandes utiles au développeur.
CVS permet à plusieurs développeurs de travailler sur le même fichier source. Dans son fonctionnement standard, il ne verrouille pas a priori les fichiers ; son mode de fonctionnement est optimiste : il suppose que les conflits sont rares et souvent faciles à résoudre. Si deux développeurs ont modifié le même fichier, CVS sait résoudre le conflit à la seule condition que les modifications n’aient pas été apportées à la même partie de code. Dans le cas contraire, c’est le dernier développeur qui veut mettre à jour le référentiel qui devra régler manuellement le problème (plus loin nous verrons comment).
Comme dit juste au-dessus, CVS ne sait pas régler automatiquement les conflits liés à la modification par plusieurs développeurs de la même partie de code à l’intérieur d’un fichier source.
De même, il n’est pas approprié à la gestion de fichiers binaires. Par commodité ( pour générer plus facilement les distributions, par exemple ), les fichiers exécutables ou les images peuvent être stockés au même niveau que le référentiel ; mais il ne faut pas attendre de miracles de la part de CVS.
Par ailleurs, si CVS est indispensable pour le suivi des modifications et la gestion des versions, il ne remplace en aucun cas le suivi de projet : méthodes de travail et de communication entre développeurs, règles de programmation, tests de non régression, etc… Il ne peut pallier à une absence d’organisation. Dans le même ordre d’idées, il faudra se poser quelques questions concernant la sécurité : qui peut accéder au référentiel du projet ? par quel moyen ? ne vaut-il pas mieux verrouiller dans certains cas des fichiers sensibles ? Mais toutes ces interrogations relèvent plus du rôle de l’administrateur et ont leur place dans un autre document.
Ce document s’adressant en priorité aux développeurs, nous supposons que CVS est installé et entièrement configuré sur le serveur. Dans notre exemple, le référentiel du projet est installé dans le répertoire /usr/local/cvs d’un serveur hôte accessible par l’adresse mon-serveur.org et s’appelle projettest. Votre compte d’accès au serveur est : develop1/xw31kz. Nous ne nous intéresserons donc qu’au côté " client ". Tout d’abord, une petite question : sur quel système d’exploitation travaillez-vous ?
- Linux : dans ce cas, la plupart des distributions de Linux contiennent une version de CVS. Si CVS est déjà installé sur votre machine, il suffit de définir quelques variables système. Sinon, vous pouvez télécharger une version de CVS (www.cvshome.org ) et procéder à son installation ( cf.2.1.1 ).
- Windows : il faut charger et installer un client CVS, par exemple WinCVS à l’adresse
http://cvsgui.sourceforge.net (cf.2.1.2).
CVS contient son propre client CVS. Pour vérifier si CVS est installé, il suffit de taper sur la ligne de commande :
cvs
Si le système sait interpréter cette commande, il en affichera les différentes options et paramètres. Vous pouvez alors passer directement au paragraphe 2.1.3
Sinon, le plus simple est d’installer CVS à partir des sources. Commencez par récupérer le fichier le plus récent à l’adresse : http://ccvs.cvshome.org/servlets/ProjectDownloadList ( par exemple,
cvs-1.11.4.tar.gz, la dernière distribution à ce jour, en format GZip ).
Puis, sur la ligne de commandes, placez vous dans le répertoire dans lequel vous souhaitez installer le produit (ex. /usr/local/src )et tapez les ordres suivants :
tar xzvf cvs-1.11.4.tar.gz
cd cvs-1.11.4
./configure
make
make install
L’installation est terminée.
Téléchargez WinCVS à l’adresse : http://cvsgui.sourceforge.net ou un site miroir. Vous pouvez également utiliser un autre client CVS de votre choix, comme TurtoiseCVS. Mais dans notre exemple ci-dessous, nous utiliserons WinCVS 1.2 Stable (fichier WinCvs120.zip de 3618 Ko).
Décompressez le fichier téléchargé dans un répertoire temporaire, puis procédez à l’installation en cliquant sur le fichier setup.exe .
Il reste à configurer 3 variables système:
CVSROOT qui donne l’identification de l’utilisateur, l’adresse du serveur distant et le chemin d’accès au référentiel du projet sur le serveur (dans notre exemple : /usr/local/cvs sur le serveur).
CVS_RSH indique quel est l’utilitaire d’accès au référentiel externe. Par défaut, CVS utilise rsh ; pour plus de sécurité, il est conseillé d’utiliser ssh.
CVSEDITOR sert à renseigner l’éditeur de texte qui servira à renseigner les messages et commentaires lors des mises à jour du référentiel. Si cette variable d’environnement n’est pas renseignée, CVS utilisera l’éditeur défini par la variable EDITOR . Si aucune des deux variables n’est positionnée, CVS provoquera une erreur d’exécution.
Sous Linux, la syntaxe pour définir ces variables dépend du shell. En Bourne shell, on utilisera la commande " export " ; en C shell, la commande setenv.
Ex. en Bourne shell :
export CVSROOT=develop1/xw31kz@mon-serveur.org:/usr/local/cvs
export CVS_RSH=ssh
export CVSEDITOR=vim
Pour éviter d’avoir à retaper ces instructions à chaque fois, il est fortement conseillé de les enregistrer dans un fichier d’initialisation qui s’exécute automatiquement à l’ouverture d’une session (ex. fichier bash).
Sous Window, et à condition d’utiliser WinCVS, le paramétrage des mêmes variables d’environnement se fait au travers d’un écran comme celui figurant ci-après :

Il faut commencer par créer le répertoire dans lequel nous allons récupérer l’image locale du référentiel. Pour notre exemple, nous travaillerons dans le répertoire cvs dans l’arborescence /home/monrep. On tapera donc la commande :
cd /home/monrep
mkdir cvs
Importons maintenant sur notre machine locale le projet de développement :
cvs checkout projettest
Cette commande va dupliquer localement l’intégralité du module projettest. En fait, cvs checkout sert normalement à comparer les modifications apportées aux fichiers et répertoires du projet et à les répercuter sur la base locale. Comme il s’agit de sa toute première utilisation, aucun fichier n’est trouvé localement et par conséquent l’ensemble des fichiers est rapatrié.
Si aucune erreur ne s’est produite, un répertoire projettest a été créé dans l’arborescence locale /home/monrep/cvs. Il contient tous les fichiers sources du projet et un sous-répertoire CVS que l’outil utilise pour la gestion de ses données.
Voilà, vous êtes prêts à travailler sur les sources dans votre répertoire local.
Après avoir modifié certains fichiers, vous souhaitez mettre à jour le référentiel en y répercutant toutes les modifications que vous avez apportées au projet dans votre base locale.
Pour vérifier quels sont les fichiers qui nécessitent leur mise à jour, tapez la commande :
cvs checkout projettest
Les fichiers modifiés sont identifiés par la lettre " M " devant leur nom. Attention, cette commande n’effectue pas réellement la mise à jour du référentiel distant. Il est nécessaire d’utiliser pour cela :
cvs commit
L’outil vous demande alors de saisir un message pour commenter la mise à jour que vous effectuez. C’est à cette occasion qu’il utilise la variable CVSEDITOR définie au § 2.1.3 pour savoir quel éditeur de texte doit servir à la saisie du message. Selon ce qui aura été défini dans les méthodes de développement standard, il conviendra de saisir dans ce commentaire : votre nom, l’objet de vos modifications, etc.
Comme toutes les commandes cvs, la commande commit accepte des options et/ou des paramètres. Ainsi, plutôt que de saisir votre commentaire au travers d’un éditeur de texte, vous pouvez le taper directement sur la ligne de commande, en utilisant l’option -m. Par exemple :
cvs commit -m ‘develop1 : correction des formats de dates’
La commande commit demande explicitement à cvs de mettre à jour le référentiel. A cette occasion, il se peut que cvs détecte un conflit. C’est le cas si un autre utilisateur a validé ses propres modifications pendant que vous apportiez localement des correctifs ou des améliorations au projet. Si un fichier nommé fichier1.txt du référentiel n’est plus dans l’état où vous l’aviez récupéré, cvs signale le problème et n’effectue pas la mise à jour.
Deux cas peuvent alors se présenter :
cvs update fichier1.txt
Ceci met à jour votre fichier local, en y répercutant les modifications appliquées par l’autre utilisateur. Vous êtes prêt à tenter un nouveau " commit ".
Pour valider les modifications sur le référentiel, il vous suffit de retaper la commande :
cvs commit fichier1.txt
Remarque : l’organisation et la méthodologie du développement peuvent contribuer à diminuer le risque de conflits. Comme indiqué en préambule, l’outil cvs travaille sur un mode optimiste et ne verrouille pas a priori les fichiers. Dans le cadre du développement d’une application, il est d’autant plus indispensable d’établir des règles et des méthodes. Une organisation des équipes, une communication régulière entre développeurs, un suivi du projet, des mises à jour fréquentes du référentiel minimiseront les situations conflictuelles.
Dans le cadre du développement coopératif, vous pouvez être amené à créer un nouveau fichier ou à supprimer un fichier existant. Mais une création ou une suppression de fichier, pas plus que la modification d’un fichier existant, ne se répercute pas automatiquement sur le référentiel. Les fichiers sont ajoutés ou supprimés localement. Pour mettre à jour le projet distant, il va falloir l’indiquer explicitement.
Pour ajouter un nouveau fichier, on utilisera la commande cvs " add " ; pour la suppression, la commande cvs " remove ".
Exemple d’ajout d’un fichier :
cvs add -m ‘Ajout du fichier nouvau_fichier.txt’ nouveau_fichier.txt
cvs commit nouveau_fichier.txt
Exemple de suppression de fichier :
cvs remove vieux_fichier.txt
cvs commit vieux_fichier.txt
Notons enfin que, puisque cvs conserve tout l’historique des modifications, un fichier effacé par la commande " remove " peut toujours être récupéré et rajouté au projet par la commande " add ".
Nous avons à présent identifié les commandes de base pour travailler avec cvs en tant qu’utilisateur. Les paragraphes suivants nous permettrons :
Avec les quelques commandes que nous avons vues ci-dessus, il est déjà tout à fait possible de travailler avec CVS et de contribuer à un projet de développement en tant qu’utilisateur. Mais le développeur n’est généralement pas un utilisateur ordinaire ; c’est un être curieux qui désire en savoir davantage. Voyons donc les petits plus que CVS peut nous apporter : de nouvelles commandes ou options qui nous faciliterons la tâche ou nous permettrons de mieux comprendre le suivi des versions ou des distributions.
On distingue deux grandes catégories d’options qui accompagnent la plupart des commandes CVS: les options globales et les options générales.
Par exemple, dans la commande
cvs -q checkout projettest, l’option -q est dite globale (elle se trouve à gauche de la commande checkout)
Dans la commande
cvs add -m ‘Ajout du fichier nouvau_fichier.txt’ nouveau_fichier.txt, l’option -m est dite générale (elle se trouve à droite de la commande add).
De surcroît, chaque commande peut avoir des options qui lui sont particulières.
Par convention, dans tout ce qui suit, les mots en italiques correspondent à des variables : cvs_root_directory, editor, par exemple, sont à remplacer respectivement par un nom de répertoire et un nom d’éditeur de textes, et non à taper tels quels.
-d cvs_root_directory : force l’utilisation du répertoire cvs_root_directory en lieu et place de la variable $CVSROOT pour identifier la localisation du référentiel
-e editor : force l’utilisation de l’éditeur en lieu et place de celui identifié par les variables $CVSEDITOR ou $EDITOR
-f : exécute la commande sans faire appel au fichier ~/.cvsrc (ce fichier contient les réglages par défaut pour l’utilisation du client CVS - cf. § 5 infra)
-H : permet d’afficher l’aide ; si la commande n’est pas indiquée, alors l’aide générale de CVS est affichée.
-l : n’enregistre pas la commande dans l’historique
-n : ne modifie aucun fichier ; simule l’exécution de la commande, mais se contente d’afficher le résultat sans procéder à aucune mise à jour.
-q : exécute la commande dans un mode moins " bavard " et parfois plus lisible
-Q : exécute la commande en mode " silencieux " ; seuls les problèmes bloquants sont signalés sur la sortie standard
-r : force l’ouverture des nouveaux fichiers de travail en mode " lecture seulement "
-s variable=valeur : affecte une valeur à une variable utilisateur ( pour une explication détaillée sur les variables utilisateur, se reporter à la documentation CVS - cf. § 6.1)
-t : trace l’exécution du programme en l’exécutant pas à pas ; en combinaison avec l’option -n, permet de se familiariser avec une commande ou des options sans risquer de faire de dégâts.
-w : force l’ouverture des nouveaux fichiers de travail en mode " lecture-écriture " ; n’est utile qu’après utilisation de l’option globale -r, puisque les fichiers sont, par défaut, accessible en lecture-écriture.
-x : utilise le cryptage pour les échanges de données entre client et serveur
-z gzip_level : force le niveau de compression des données. Les valeurs vont de 1 (faible compression) à 9 (forte compression), utile pour une connexion client-serveur à faible débit. La valeur par défaut est 0 (pas de compression).
Les options générales décrites ci-dessous sont valables pour la plupart des commandes du client CVS. Il existe cependant des exceptions et certaines options n’auraient pas de sens en association avec certaines commandes. Le tableau récapitulatif en fin de paragraphe indique, pour chacune des commandes, les différentes options générales supportées par le produit.
-D date_spec : utilise la dernière version immédiatement antérieure à la date passée dans le paramètre date_spec. Pour les formats de dates, voir le paragraphe 5
-f : lorsqu’on indique une date ou une étiquette à une commande, CVS ignore normalement les fichiers qui n'existaient pas à la date indiquée ou qui n’ont pas d’étiquette. Cette option -f permet d’inclure les fichiers qui sont dans ce cas.
-kkflag : modifie le mode de substitution des mots-clés (pour plus de détails sur cette notion, cf. § 5 infra)
Sachez que l’utilisation la plus fréquente de l’option -k est la syntaxe -kb qui signale à CVS qu’un fichier doit être traité comme étant un binaire. D’autre part -kk inhibe complètement la substitution des mots-clés.
-l : n’exécute la commande que sur les fichiers du répertoire local ; par défaut l’exécution des commandes se fait de manière récursive sur les sous-répertoires.
-n : CVS permet de lancer un programme de contrôle lors de l’exécution d’une commande ; l’option -n inhibe le lancement de ces programmes.
-R : n’est utile qu’après utilisation de l’option -l ; rétablit le fonctionnement standard qui exécute récursivement la commande sur les fichiers du répertoire courant et ses sous-répertoires
-r nom_étiquette : force CVS à utiliser un numéro de version identifié par la variable nom_étiquette plutôt que la version la plus récente. En plus des étiquettes définies par les commandes " tag " et " rtag " (voir ces commandes, § 5.3), il existe 2 étiquettes par défaut : HEAD identifie la version la plus récente du référentiel et BASE identifie la version la plus récente mise à jour dans le répertoire local de travail.
|
Commande |
-D |
-f |
-k |
-l |
-n |
-R |
-r |
|
add |
X |
||||||
|
annotate |
X |
X |
X |
X |
X |
||
|
checkout |
X |
X |
X |
X |
X |
X |
X |
|
commit |
X |
X |
X |
X |
|||
|
diff |
X |
X |
X |
X |
X |
||
|
edit |
X |
X |
|||||
|
editors |
X |
X |
|||||
|
export |
X |
X |
X |
X |
X |
X |
X |
|
help |
|||||||
|
history |
X |
X |
|||||
|
import |
X |
||||||
|
log |
X |
X |
|||||
|
rdiff |
X |
X |
X |
X |
X |
||
|
release |
|||||||
|
remove |
X |
X |
|||||
|
rtag |
X |
X |
X |
X |
X |
||
|
status |
X |
X |
|||||
|
tag |
X |
X |
X |
X |
X |
||
|
unedit |
X |
X |
|||||
|
update |
X |
X |
X |
X |
X |
X |
|
|
watch |
X |
X |
|||||
|
Watchers |
X |
X |
Copie les fichiers du référentiel dans le répertoire de travail. Lors de sa première utilisation, cette commande crée le répertoire de travail. Outre les options générales ci-dessus, checkout peut utiliser les options complémentaires :
-A : ré-initialise les dates et les étiquettes collées aux fichiers (pour la notion d’étiquette collante, cf. § 5 infra)
-d directory : indique le répertoire dans lequel CVS doit créer le répertoire de travail ; sinon, le répertoire courant est utilisé
-j version : permet de fusionner deux branches ( pour les notions de branches et de fusion, cf. § 5)
-p : envoie les fichiers vers la sortie standard
-P : supprime les répertoires vides
Après que la commande " checkout " ait créé votre répertoire de travail à partir du référentiel qui se trouve sur le serveur, d’autres développeurs ont pu apporter des modifications au code source du projet. Il convient donc périodiquement de lancer la commande " update " pour remettre à jour votre répertoire de travail pour rester en phase avec l’évolution du référentiel. En effet, sauf en cas de conflit, cette commande fusionne dans vos fichiers locaux tous les changements intervenus sur les fichiers distants depuis le dernier " checkout " ou " update "
En plus des options générales énumérées dans le tableau ci-dessus, la commande " update " accepte les options spécifiques suivantes :
-A : Supprime les étiquettes collantes, dates et paramètres de l’option -k associés aux fichiers
-d : autorise la création de nouveaux répertoires, alors que normalement la commande ne permet la mise à jour que des répertoires et fichiers déjà présents dans la copie privée du projet
-I profil : ignore les fichiers dont le nom correspond à profil (profil peut contenir des caractères jokers)
-j version : permet de fusionner des modifications entre deux versions
-p : envoie les fichiers vers la sortie standard
-P : supprime les répertoires vides
Les deux commandes vous informent de leur exécution en éditant une ligne pour chaque fichier traité. Chaque nom de fichier est précédé par un caractère indiquant son statut :
U fichierid : le fichier a été mis en conformité avec le référentiel. C’est le cas pour tout fichier présent dans le référentiel mais inexistant dans votre environnement local, ainsi que pour les fichiers que vous n’avez pas modifiés localement mais qui ne sont plus dans la version la plus récente
P fichierid : identique au statut U, mais indique que le serveur cvs a envoyé un patch plutôt que le fichier dans son intégralité
A fichierid : le fichier a été ajouté à votre copie privée et sera ajouté au référentiel lors du prochain " commit "
R fichierid : le fichier a été supprimé de votre copie privée et sera supprimé du référentiel lors du prochain " commit".
M fichierid : le fichier a été modifié dans votre environnement local. Deux cas sont possibles :
- vous avez modifié le fichier localement et il n’y a pas de version plus récente dans le référentiel
- il y a une version plus récente de ce fichier dans le référentiel, et cvs a réussi à fusionner sans conflit les changements dans votre fichier local
C fichierid : un conflit non résolu est survenu entre votre fichier local et celui se trouvant dans le référentiel. Le fichier fichierid contient le résultat de la tentative de fusion, donc vos propres modifications et celles issues du référentiel. Une copie portant le nom #fichierid.version est cependant créée dans votre répertoire et contient votre version du fichier fichierid.
? fichier : le fichier se trouve dans votre répertoire, mais ne correspond à rien de connu dans le référentiel. Il ne fait pas non plus partie des fichiers à exclure de la mise à jour ( dont la liste est définie dans le fichier .cvsignore - cf. § 5.4)
Cette commande ordonne l’archivage dans le référentiel de toutes les modifications apportées à la copie locale du projet : modification, création ou suppression de fichiers. Les options spéciales sont :
-f : force CVS à procéder à l’archivage même si aucune modification n’a été faite
-F fichier_message : fait en sorte que le message associé à la mise à jour soit lu dans le fichier fichier_message au lieu d’être saisi dans un éditeur de texte.
-m message : permet de saisir directement sur la ligne de commande le commentaire associé à la mise à jour plutôt que de passer par un éditeur de texte
Cette commande permet d’ajouter des fichiers ou des répertoires au projet. Les modifications ne sont réellement répercutées sur le référentiel que par l’exécution d’un " commit ".
La seule option spéciale est :
-m message : permet de saisir directement sur la ligne de commande le commentaire associé à la mise à jour plutôt que de passer par un éditeur de texte
Cette commande permet de retirer des fichiers ou des répertoires au projet. Les modifications ne sont réellement répercutées sur le référentiel que par l’exécution d’un " commit ".
La seule option supplémentaire est :
-f nomfichier : demande à CVS de supprimer physiquement le fichier dans le répertoire local avant de mettre à jour le référentiel.
A noter qu’un fichier supprimé par erreur par la commande cvs remove peut toujours être récupéré par la commande cvs add .
Dans ce paragraphe nous allons étudier les commandes permettant de suivre les versions et l’état des fichiers.
Cette commande affiche l’état des fichiers en indiquant s’ils sont à jour. Elle affiche également le numéro de version, la date de la version, ainsi que des informations sur les éléments " collants "
(cf. § 5).
L’option spéciale -v affiche des renseignements complémentaires sur les différentes étiquettes qui ont été associées au fichier (pour la notion d’étiquette, voir les commandes " tag " et " rtag " ci-dessous)
Affiche des informations sur l’historique des fichiers, notamment leur localisation, leur dernière révision ainsi que les noms symboliques et étiquettes qui leur sont affectés. Pour chaque révision, on obtient également l’auteur des modifications, le nombre de lignes ajoutées ou retranchées, le commentaire associé à la mise à jour.
Cette commande peut recevoir un nombre important d’options particulières :
-b: n’édite que les informations sur la branche principale (pour la notion de branche, cf. §5)
-d dates : N’édite que les versions correspondant aux dates spécifiées dans le(s) paramètre(s) dates ; ce dernier peut prendre les formats suivants :
d : sélectionne une seule révision, la plus récente à la date d ou antérieur à cette date ;
>d : sélectionne toutes les versions postérieures à la date d
<d : sélectionne toutes les versions antérieures à la date d
d1<d2 : sélectionne toutes les versions dont la date est comprise entre d1 et d2
Les caractères < et > peuvent être remplacés par <= et >= si l’on veut que la date soit incluse dans la sélection.
-h : omet les informations détaillées sur chaque version et n’affiche que l’entête
-N : n’affiche pas les informations concernant les étiquettes (tags)
-rrévisions : N’édite que les versions correspondant aux révisions indiquées dans le(s) paramètre(s) révisions (à noter que le paramètre révisions est directement accolé à l’option -r, sans espace) ; ce dernier peut prendre les formats suivants :
:r : sélectionne les versions depuis le début de la branche jusqu’à la version r
r: : sélectionne les versions depuis la version r jusqu’à la fin de la branche
r1:r2 : sélectionne les versions depuis la version r1 jusqu’à la version r2
br : sélectionne toutes les versions de la branche br
br1:br2 : sélectionne les versions de toutes les branches comprises entre br1 et br2
br. : sélectionne la dernière version de la branche br
-R: dans les autres commandes CVS, cette option est utilisée pour effectuer des traitements récursifs. Ici, elle sert à n’afficher uniquement que le nom de fichier RCS
-s status : n’affiche les informations que pour les versions ayant un état correspondant à l’un des statuts du paramètre status (plusieurs paramètres peuvent être donnés, séparés par des points-virgules)
-t: mêmes informations que l’option -h avec, en plus, le texte descriptif de chaque version
-wutils : n’affiche que les versions réalisées par les utilisateurs identifiés dans la liste de paramètres utils (séparés par des points-virgules)
La commande diff sert à comparer différentes versions de fichiers. Par défaut, elle compare la version de votre répertoire de travail local avec celle du référentiel d’origine dont elle avait été copiée. Si on indique des noms de fichiers, seuls ces fichiers sont comparés ; si on indique des répertoires, tous les fichiers de ces répertoires seront comparés.
Les options globales s’appliquent. Les options particulières ci-dessous servent à définir le format d’affichage du résultat de la comparaison. Elles sont équivalentes aux options de la commande GNU diff . Pour la liste exhaustive des options, se référencer à la documentation officielle (cf. 6.1)
-a: traite tous les fichiers comme du texte et les compare ligne à ligne, même s’il ne s’agit pas de texte
-b: ignore toutes les modifications consistant simplement en des espaces blancs
-B: ignore les changements dus à l’insertion ou à la suppression de lignes blanches
-c: utilise le format de sortie lié au contexte
-C nblignes: utilise le format de sortie lié au contexte et affiche le nombre de lignes nblignes ( par défaut 3 lignes, si nblignes est omis)
-i: ignore les changements dus à la casse ; considère les majuscules comme identiques au minuscules
-N: si un fichier est trouvé dans un des répertoires à comparer et pas dans l’autre, cette option fait en sorte que la commande compare le fichier avec un fichier vide
-p: pour les programmes C, affiche dans quelles fonctions ont eu lieu les modifications
-s: signale quand deux fichiers sont identiques
-t: remplace les tabulations par des espaces dans le rapport de sortie
-w: ignore tous les espaces blancs
Cette commande affiche, pour chaque fichier spécifié, des informations concernant la dernière modification de chaque ligne. On peut ainsi connaître les lignes qui ont été changées ou ajoutées, avec le numéro de version correspondant, mais pas les lignes supprimées ou remplacées ( il faut alors utiliser la commande diff ci-dessus). Pour chaque ligne, on obtient, en plus du numéro de version, l’utilisateur et la date de modification.
annotate accepte les options générales figurant au tableau du § 4.1
CVS sait gérer un historique mis à jour lors de chaque utilisation des commandes checkout, commit, rtag, update et release. Pour cela, il faut avoir créé un fichier nommé history dans le répertoire $CVSROOT/CVSROOT/ sur le serveur (dans l’arborescence du référentiel).
La commande history permet alors d’afficher des informations de ce fichier historique sous différents formats et selon plusieurs critères de tri (chronologie, utilisateur, type de modification).
En plus des options générales -D et -r, les options particulières suivantes s’appliquent :
-a: par défaut, seul l’historique de l’utilisateur courant est affiché ; cette option force la commande à afficher l’historique de tous les utilisateurs
-c: signale chaque modification du référentiel par la commande commit
-f nomfichier: donne les informations sur le fichier nomfichier
-l: n’affiche que la dernière modification
-m module: affiche le rapport pour un module particulier (l’option -m peut être répétée plusieurs fois dans une même commande history)
-p référentiel: affiche le rapport pour un référentiel particulier (l’option -p peut être répétée plusieurs fois dans une même commande history)
-r vers: affiche des informations concernant les versions, en cherchant dans tous les fichiers du référentiel depuis que la version ou l’étiquette du nom de vers apparaît dans ces fichiers
-t étiquette: équivalent à l’option -r, mais ici seul le fichier history est parcouru ; cette option est donc beaucoup plus rapide
-u util: montre les enregistrements correspondant à l’utilisateur util
-w : n’affiche l’historique que pour le répertoire courant
-x typeact: extrait de l’historique les enregistrements correspondant au type d’action typeact. Chaque type d’action est identifié par une lettre (ces lettres peuvent être combinées dans le paramètre typeact). Certaines commandes n’ont qu’une seule lettre pour identifier leur action ; par contre les commandes update et commit donnent lieu à plusieurs types d’action. C’est ce que montre le tableau ci-dessous :
|
commande |
Lettre |
Action |
|
release |
F |
|
|
checkout |
O |
|
|
export |
E |
|
|
rtag |
T |
|
|
update |
C |
Une fusion était nécessaire, mais un conflit a été détecté nécessitant une intervention manuelle |
|
G |
Une fusion était nécessaire et s’est effectuée sans problème |
|
|
U |
Un fichier de travail a été copié depuis le référentiel |
|
|
W |
La copie de travail a été supprimée parce qu’elle a disparu du référentiel |
|
|
Commit |
A |
Un fichier a été ajouté pour la première fois |
|
M |
Un fichier a été modifié |
|
|
R |
Un fichier a été supprimé |
Pour une liste exhaustive des options de la commande history, il est recommandé de se référer à la documentation de CVS (notamment le manuel de Cederqvist et alii - cf. 6.1)
Dans ce chapitre, nous allons aborder quelques commandes, destinées certes à l’utilisateur de CVS, mais un peu plus orientées vers l’administration de projet. C’est dire qu’elles ne sont généralement pas utilisées quotidiennement dans le cadre d’un développement. Pour les utilisateurs qui souhaitent se limiter à un usage courant de l’outil CVS, il est possible de sauter cette partie et de passer directement au chapitre 6.
Beaucoup d’organisations peuvent trouver le fonctionnement standard de CVS tout à fait à leur goût et donc s’en contenter.
D’autres préféreront maîtriser mieux le processus de développement, savoir qui modifie un fichier à un instant donné pour permettre aux utilisateurs de se coordonner et s’informer mutuellement, pour éviter les conflits au moment de la mise à jour du référentiel. Il est notamment possible d’empêcher deux utilisateurs de modifier simultanément le même fichier, ce qui revient à modifier le comportement standard de CVS qui se base sur un mode de verrouillage optimiste.
Par défaut, CVS autorise chaque développeur à éditer n’importe quel fichier de son répertoire de travail et à le modifier à tout moment. Les autres développeurs ne sont pas avertis de cette action, et ne le seront que lors de l’exécution d’une commande qui compare le contenu du référentiel avec leur propre répertoire de travail (update, checkout, commit) . La commande watch permet de mettre en place un dispositif de surveillance des fichiers qui permettra aux développeurs ne plus avoir de mauvaise surprise au moment de la mise à jour, puisqu’ils pourront être avertis préalablement des modifications faites par les autres.
cvs watch on [-lR] files . . . : précise que les utilisateurs devront lancer la commande cvs edit pour pouvoir éditer les fichiers files. CVS rend les fichiers de travail files accessibles en lecture seulement. Le paramètre files peut contenir des noms de répertoires. S’il est omis, c’est l’ensemble du référentiel qui est soumis au dispositif de surveillance
cvs watch off [-lR] files . . . : A l’inverse, la sous-commande off rend l’accès en lecture-écriture aux fichiers bridés par la sous-commande on.
Il est possible de demander à CVS de nous avertir quand certaines actions concernent un fichier.
cvs watch add [-a action] [-lR] files . . . : ajoute l’utilisateur courant à la liste des personnes à prévenir lors des modifications de fichiers. L’option -a précise quels sont les événements que CVS doit signaler :
edit : un autre développeur a appliqué la commande edit au fichier surveillé
commit : un autre utilisateur a validé ses modifications apportées aux fichiers
unedit : un autre utilisateur a renoncé aux modifications faites sur les fichiers, soit en utilisant la commande unedit, soit en utilisant la commande release, soit en supprimant physiquement les fichiers et en les recréant par la commande update.
all : pour toutes les actions décrites ci-dessus (utilisé par défaut)
none : pour aucune des actions (n’a d’intérêt qu’avec la commande edit)
L’option -a peut apparaître plusieurs fois dans la commande ou être omise (dans ce cas, l’action par défaut est all)
cvs watch remove [-a action] [-lR] files . . . : annule une demande de notification établie en utilisant la commande cvs watch. Si l’option -a est présente, seules les actions explicitement indiquées sont annulées.
Quand il y a lieu d’avertir les utilisateurs, cvs fait appel au fichier d’administration appelé notify. Chaque ligne de ce fichier est une expression régulière suivie par une commande à exécuter. Si ce fichier ne devait comporter qu’une seule ligne, ce serait la ligne standard ci-dessous :
ALL mail %s -s "Information de notification CVS"
C’est d’ailleurs ce que contient le fichier history créé par défaut par la commande init. Cette ligne de commande a pour conséquence de prévenir les utilisateurs (%s est une variable à laquelle CVS substitue le nom d’utilisateur lors de l’exécution de la ligne de commande) par courrier électronique.
Si on n’adapte pas un peu le procédé, les utilisateurs recevraient tous leur informations sur le serveur, ce qui n’est pas vraiment pratique. On pourrait évidemment écrire un script pour rediriger l’information ; mais CVS nous facilite la tâche en nous permettant d’associer à chaque utilisateur une adresse de notification. Il suffit pour cela de créer un fichier users dans le répertoire CVSROOT avec, pour chaque utilisateur, une ligne au format utilisateur :valeur. Pour peu que valeur contienne une adresse électronique, CVS utilisera cette information en lieu et place du nom d’utilisateur.
Comme un fichier placé sous surveillance grâce à la commande watch n’est accessible qu’en lecture seule, il n’est pas possible de le modifier. Pour le rendre accessible en mode lecture-écriture et prévenir les autres utilisateurs de notre intention de le modifier, nous utiliserons la commande edit.
cvs edit [options] files . . . : Les options sont les mêmes que pour la commande watch add. Les fichiers sont rendus accessibles en lecture-écriture ; CVS avertit les utilisateurs ayant sollicité un avertissement quand les fichiers files sont appelés par la commande edit ; ces fichiers sont temporairement placés sous surveillance pour l’utilisateur (sauf si l’option -a est positionnée) et la surveillance ne sera levée que par l’application des commandes unedit ou commit à ces fichiers.
cvs unedit [-lR] files . . . : abandonne tout ce qui a été fait sur les fichiers files et les remet en conformité avec le référentiel. CVS rend ces fichiers accessibles en lecture seule et en avertit les utilisateurs ayant demandé à être informés en cas d’action de type unedit
cvs watchers [-lR] files . . . : donne la liste des utilisateurs ayant placé les fichiers files sous surveillance. Le compte rendu indique les fichiers surveillés et l’adresse de chaque observateur.
cvs editors [-lR] files . . . : donne la liste des utilisateurs qui sont en train d’éditer et de modifier les fichiers files. Le compte rendu indique l’adresse électronique de l’utilisateur, le moment où il a commencé à modifier un fichier, ainsi que l’adresse de l’hôte et le répertoire de travail où se trouve le fichier modifié.
Cette commande fonctionne de la même manière que la commande checkout. Elle permet d’exporter les fichiers du référentiel sans les répertoires spécifiques à l’administration de CVS. Elle sert notamment à préparer une distribution des sources d’un module. Il convient d’utiliser les options courantes -D date ou -r révision pour créer une copie avec comme critère, soit la date, soit la version.
Les options globales du tableau 4.1.2 s’appliquent ici. Les options particulières sont celles de la commande checkout :
-d répertoire : crée le répertoire passé en paramètre pour y copier les fichiers, au lieu d’utiliser le nom du module
-n : empêche l’exécution de programmes de contrôle
Cette commande sert à importer la totalité d’une distribution de sources d’origine externe dans le répertoire contenant le référentiel. Elle est utilisée notamment pour créer le référentiel à l’origine. Elle permet aussi d’intégrer au référentiel du code développé en dehors de l’outil CVS. La syntaxe de la commande est la suivante :
cvs import -m "Import - Création du projet initial" directory étiquette_origine étiquette_version
A quoi correspondent les 3 arguments ?
directory : est le nom du répertoire dans lequel seront importés les sources. CVS copie les fichiers du répertoire courant dans le répertoire $CVSROOT/directory.
étiquette_origine : en anglais " vendor tag ", c’est un nom symbolique pour la branche (par défaut, la branche est 1.1.1)
étiquette_version : c’est un nom symbolique pour la version
L’option -m permet d’associer un commentaire directement sur la ligne de commande ; sinon, CVS ouvre l’éditeur de texte pour que l’utilisateur saisisse ce commentaire.
L’option -k autorise la substitution de mots-clés (cf. 5.5 pour cette notion)
L’ option spécifique -b nom_branche permet d’indiquer un nom de branche vers laquelle effectuer l’import. Par défaut, CVS utilise la branche 1.1.1 comme branche d’origine.
Cederqvist et alii (cf. 6.1) donne d’exemple suivant :
Supposons que nous ayons deux équipes, l’équipe rouge et l’équipe bleue, qui nous envoient des sources. Nous voulons importer les contributions de l’équipe rouge dans la branche 1.1.1 et utiliser l’étiquette d’origine ROUGE. Nous souhaitons importer les contributions de l’équipe bleue dans la branche 1.1.3 et utiliser l’étiquette d’origine BLEU. Alors les commandes que nous utiliserons sont :
cvs import directory ROUGE RG_1-0
cvs import -b 1.1.3 directory BLEU BL_1-5
Attention, CVS n’établit aucune corrélation entre la branche de l’option -b et le nom symbolique de branche de l’argument étiquette_origine.
Les autres options supplémentaires sont :
-I nom : force CVS à ignorer le fichier dont le nom est contenu dans le paramètre nom. Cette option peut être répétée plusieurs fois sur la même commande. Si on veut forcer CVS à traiter tous les fichiers, on utilise -I !
Voir également le fichier cvsignore (cf. 5.4)
-W spec : précise dans le paramètre spec les fichiers qui doivent être filtrés pendant l’import (par exemple, pour identifier les fichiers binaires).
Ex. : cvs import -I ! -W "*.exe -k ’b’" first-dir vendortag reltag
filtre tous les fichiers (-I !) et identifie les fichiers se terminant par l’extension .exe comme étant des binaires.
La commande import affiche sur la sortie standard les codes états suivants :
U nomfic : le fichier existait déjà dans le référentiel et n’a pas été modifié localement
N nomfic : le fichier est nouveau, il a été ajouté au référentiel
C nomfic : le fichier existait dans le référentiel et il a été modifié localement ; une fusion est nécessaire
I nomfic : le fichier a été ignoré
L nomfic : le fichier est un lien symbolique, CVS l’ignore.
On utilise la commande release pour supprimer proprement un répertoire. Bien entendu, il est possible de supprimer manuellement un répertoire, mais alors CVS n’en concerne aucune trace ; alors qu’avec la commande release le fichier history peut être renseigné (à condition qu’il soit activé).
Cette méthode évite aussi de perdre involontairement des modifications. En effet, release vérifie qu’il n’existe pas de modifications non mises à jour, que vous l’exécutez à partir d’un répertoire situé immédiatement au-dessus d’un répertoire de travail cvs, et que le référentiel est cohérent.
Une seule option est possible :
-d : supprime la copie de travail de vos fichiers locaux, sinon ces fichiers resteront dans votre répertoire. Attention, si vous avez ajouté à la main des répertoires, sans les ajouter au référentiel, ils seront supprimés sans avertissement même s’ils ne sont pas vides. Pour éviter de courir ce risque, il convient de toujours ajouter les répertoires par la commande add.
Avant d’exécuter la commande release, CVS édite un rapport d’une ligne pour chaque fichier qui n’est pas à jour. Voir le tableau ci-dessous pour la signification des statuts de chaque ligne.
|
Code |
Signification |
|
U fichier P fichier |
Il existe une version plus récente de ce fichier dans le référentiel et vous n’avez pas mis à jour votre copie locale |
|
A fichier |
Le fichier a été ajouté à votre répertoire local, mais vous n’avez pas validé cet ajout. Ce fichier sera perdu si vous supprimez votre copie des sources |
|
R fichier |
Le fichier a été supprimé de votre répertoire local, mais pas du référentiel, car vous n’avez pas validé cette suppression |
|
M fichier |
Le fichier contenu dans votre copie privée a été modifié localement. |
|
? fichier |
Le fichier est dans votre répertoire mais ne correspond à rien pour l’outil CVS : il est absent du référentiel et ne correspond pas à un fichier que CVS doit ignorer. Il sera perdu. |
Cette commande permet de réaliser un fichier au format " patch " à partir des différences entre deux versions. Avec ce fichier patch, il est alors possible de mettre à jour une distribution antérieure.
Le patch peut être réalisé à partir des critères date ou version, en utilisant respectivement les options -D et -r. Si la distribution se trouve dans différents répertoires, il conviendra d’utiliser l’option -p pour que le patch puisse retrouver dans ces différents répertoires les anciens sources nécessitant une mise à niveau.
En plus des options communes, rdiff peut être appelé avec les options suivantes :
-c : utilise le format contextuel de la commande diff (voir plus haut) ; c’est le format par défaut
-s : génère un rapport résumé des modifications intervenues sur les fichiers au lieu de créer un patch. Cela permet de savoir quels fichiers ont changé depuis une date ou une version donnée.
-t : affiche à l’écran les différences entre les deux dernières versions. Cela permet de savoir quel est le dernier changement intervenu sur un fichier.
-u : utilise le format contextuel unidiff pour l’affichage des différences ( usage anecdotique !)
Pour illustrer l’utilisation de rdiff pour générer un patch, nous reprendrons l’exemple cité par Cederqvist (cf. 6.1) :
Supposez que nous receviez un message électronique de foo@example.net qui vous demande une mise à jour pour passer de la version 1.2 à la version 1.4 du compilateur tc. Vous n’avez pas sous la main un tel patch, mais avec CVS vous allez pouvoir facilement le créer avec la commande suivante :
cvs rdiff -c -r FOO1_2 -r FOO1_4 tc | Mail -s ’Le patch que vous avez demandé’ foo@example.net
Cette commande utilise le format de sortir diff (cvs rdiff -c) pour extraire les différences entre la version FOO1_2 et la version FOO1_4 du fichier tc (-r FOO1_2 -r FOO1_4 tc) ; le résultat de cette commande est ensuite redirigé vers une commande mail qui l’envoie à l’adresse électronique foo@example.net en y ayant joint un message d’information ( | Mail -s ’Le patch que vous avez demandé’ foo@example.net).
Les numéros de version attribués automatiquement aux fichiers par CVS vivent leur propre vie. Par défaut, la version originelle de chaque fichier est 1.1. Ces numéros de version n’ont pas forcément un quelconque rapport avec les numéros de distribution de l’application. Les numéros de version peuvent changer plusieurs fois entre deux distributions ; par ailleurs une distribution comprend des fichiers ayant des numéros de version différents. Ainsi, si on prend pour exemple une petite application document comprenant trois fichiers ( entete.txt, page.txt et resume.txt ), la distribution DIST-3_2 de l’application document peut inclure les fichiers avec les versions suivantes :
entete.txt 3.11
page .txt 3.22
resume.txt 3.20
Pour attribuer un nom symbolique (ou étiquette) à une version donnée d’un fichier, on utilisera la commande tag. Pour vérifier les étiquettes d’un fichier et leur correspondance avec les numéros de version, c’est la commande status -v qui nous servira.
Une étiquette doit commencer par une lettre, minuscule ou majuscule. Elle peut contenir des lettres, des chiffres, ainsi que les caractères - (tiret) et _ (souligné), mais pas de point, de virgule ou de caractères spéciaux. CVS reconnaît par défaut les deux étiquettes BASE et HEAD, comme nous l’avons indiqué plus haut dans l’explication de l’option générale -r : HEAD identifie la version la plus récente du référentiel et BASE identifie la version la plus récente mise à jour dans le répertoire local de travail.
Une étiquette peut être appliquée à un fichier seul, un groupe de fichier ou un répertoire complet.
Cette opération est immédiatement prise en compte, sans qu’il y ait besoin de la valider en exécutant une commande commit. Sans option, la commande s’applique à la version locale des fichiers ; attention donc si cette version locale ne correspond pas à celle du référentiel. Pour éviter ce risque, il faudrait toujours utiliser la commande tag avec l’option -c.
En plus des options générales -l et -R, les options spécifiques sont :
-b : crée une étiquette de branche ( voir ci-dessous 5.3.3)
-c : vérifie que la version locale du fichier correspond à celle du référentiel. Dans le cas contraire, l’opération échoue et l’étiquette n’est pas posée.
-d : l’étiquette est effacée. A utiliser très prudemment. Pour renommer une étiquette, il est conseillé de créer une nouvelle étiquette avec les mêmes caractéristiques, puis de supprimer l’ancienne. Par exemple, si on veut renommer DIST-3_2 en STABLE-3 :
cvs tag -r DIS-3.2 STABLE-3
cvs tag -d DIS-3.2
-F : permet de déplacer une étiquette, par exemple d’une version de fichier vers une autre. Par exemple si la distribution DIST-3_2 de notre application document doit inclure désormais la version 3.25 du fichier page.txt au lieu de la version 3.22, nous utiliseront la commande ci-dessous :
cvs tag -r 3.25 -F DIST-3_2 page.txt
Alors que la commande tag travaille à partir de l’environnement local, la commande rtag permet d’appliquer une étiquette directement au référentiel, soit selon un critère de dates, soit sur la dernière version des fichiers.
Ses options sont identiques à celles de la commande tag. S’y ajoutent les options :
-a : pour effacer l’étiquette des fichiers détruits par remove
-n : pour n’exécuter aucun programme de marquage du module
CVS permet de faire des modifications sur une ligne de développement séparée, connue sous le nom de branche. Quand on modifie des fichiers sur une branche, ces modifications n’apparaissent pas sur le tronc principal ni sur les autres branches.
Une fois stabilisées, ces modifications pourront être reportées sur le tronc principal ou sur les autres branches par une opération de fusion. Cela consiste à lancer la commande cvs update -j pour mettre à jour son répertoire local ; puis à valider cette version par la commande commit qui copiera réellement les modifications sur les autres branches.
Supposons que nous ayons diffusé la distribution 1.0 de l’application document. Nous continuons à développer cette application et prévoyons une nouvelle distribution 1.1 pour le semestre prochain. Manque de chance, un bogue bloquant s’est glissé dans la distribution 1.0 et nos clients exigent un correctif immédiat (ça c’est déjà vu, je pense !). Nous détectons le bogue. Nous saurions le corriger. Hélas, la version en cours de développement est encore totalement instable et ne nous permet pas de réaliser un patch.
La solution, c’est de créer une branche sur l’arbre des versions pour tous les fichiers de la version 1.0 ; à partir de ce moment, il est possible de modifier la branche sans perturber le tronc. Quand les modifications sur la branche sont terminées, on a le choix : soit on les intègre au tronc principal, soit on les laisse sur la branche (dans ce cas, cela suppose qu’on ait corrigé le bogue simultanément sur la branche et sur le tronc.
La branche se crée avec la commande tag -b. Par exemple :
cvs tag -b BR_1_0_patch
Cette commande, exécutée dans notre répertoire de travail, crée un nom symbolique de branche basée sur la version actuelle des fichiers de notre répertoire local. Par contre, il faut savoir que cette branche est créée dans le référentiel et pas dans notre environnement local (même si elle est basée, dans notre exemple, sur la version des fichiers contenus dans notre répertoire local). Notre environnement local n’est pas automatiquement réorienté vers la branche que nous venons de créer.
Pour créer une branche non basée sur le répertoire local, on utilise la commande rtag.
cvs rtag -b -r dist-1-0 BR_1_0_patch document
crée la branche BR_1_0_patch à partir de l’étiquette dist-1-0 du module document (cet exemple de commande correspond à la méthode de création d’une branche pour résoudre un bogue dans une version antérieure, comme expliqué ci-dessus).
Il y a deux façons d’accéder à la nouvelle branche, soit en se créant une nouvelle copie de travail à partir du référentiel, soit en écrasant le contenu de sa copie de travail existante avec le contenu de la branche. En supposant que le répertoire de travail soit nommé document :
- dans la première hypothèse, on utilise la commande checkout avec l’option -r et l’étiquette de branche :
checkout -r BR_1_0_patch document
- dans la seconde hypothèse, il faut appeler la commande update pour remettre à jour son environnement local :
update -r BR_1_0_patch document
La branche BR_1_0_patch est substituée à la copie de travail d’origine, peu importe qu’elle ait eu pour source le tronc principal ou une autre branche. Nos modifications sont fusionnées et les conflits éventuels sont signalés.
Une fois qu’on a obtenu une copie de travail attachée à une branche particulière, cette copie restera liée à cette branche jusqu'à ce qu’on en décide autrement. Ceci signifie que les changements issus de la copie de travail ajouteront de nouvelles versions sur cette branche seulement, tout en laissant inchangés le tronc principal et les autres branches.
La commande status permet de savoir qu’elle branche est opérationnelle dans la copie de travail. C’est le champ " sticky tag " (étiquette collante) qui nous renseigne :
cvs status -v entete.txt
===================================================================
File: entete.txt Status: Up-to-date
Version: 3.11 Sat Jan 25 08:45:12 2003
RCS Version: 3.11 /cvsroot/document/entete.txt,v
Sticky Tag: BR_1_0_patch (branch: 3.11.2)
Sticky Date: (none)
Sticky Options: (none)
Existing Tags:
BR_1_0_patch (branch: 3.11.2)
dist-1-0 (revision: 3.11)
On peut schématiser l’évolution des numéros de version d’un fichier en disant qu’il s’agit d’une suite de nombres entiers qui s’incrémentent de un en un. On représentera l’évolution d’un fichier sur le tronc principal de la manière suivante :
1.1 à 1.2à 1.3à 1.4à 1.5
Cependant, CVS ne se limite pas à un développement linéaire. L'arbre des versions peut être divisé en branches, où chaque branche est une ligne de développement indépendante. Des changements faits sur une branche peuvent facilement être reportés sur le tronc principal.
Chaque branche se présente sous la forme d’un numéro de branche, composé d'un nombre impair de nombres entiers séparés par des points. Le numéro de branche est créé en ajoutant un nombre entier au numéro de la version à partir de laquelle la branche est issue. Plusieurs branches peuvent être issues d’une même version. Toutes les versions sur une branche ont des numéros de version constitués en ajoutant un nombre au numéro de branche. Exemple tiré du manuel de Cederqvist (cf. 6.1) :
Branche 1.2.2.3.2 1.2.2.3.2.1 à 1.2.2.3.2.2
Branche 1.2.2 1.2.2.1à 1.2.2.2à 1.2.2.3
Tronc principal 1.1 à 1.2à 1.3à 1.4à 1.5
Branche 1.2.4 1.2.4.1à 1.2.4.2à 1.2.4.3
Il n’est pas indispensable de connaître la façon est construit le numéro de branche, mais pour satisfaire votre curiosité sachez que CVS part du numéro de version dont dérive la branche et y accole, séparé par point, le premier nombre pair disponible. La première branche issue de la version 1.2 sera numérotée 1.2.2 ; la seconde 1.2.4, etc.
On peut fusionner des changements faits sur une branche vers la copie de travail en utilisant l’option -j nom_branche de la commande update. Cela fusionne dans notre copie de travail les changements faits entre le point où la branche a bifurqué et la plus récente version sur cette branche.
Reprenons une partie de notre exemple, en supposons qu’on ait donné à la branche 1.2.4 le nom symbolique SITE_PILOTE et que notre module document ne contienne que le fichier entete.txt :
Tronc principal 1.1 à 1.2à 1.3à 1.4à 1.5
Branche 1.2.4 1.2.4.1à 1.2.4.2à 1.2.4.3 étiquette SITE_PILOTE
Nous procéderons donc comme suit :
cvs checkout document
cvs update -j SITE_PILOTE entete.txt
cvs commit -m "Mise à jour de l’application au niveau atteint par SITE_PILOTE"
La première commande demande à CVS de retrouver la dernière version du module document (c’est à dire 1.5).
La seconde fusionne, dans notre copie locale du fichier entete.txt, toutes les modifications effectuées sur la branche ( donc entre la version 1.2 et la version 1.2.4.3 ).
La troisième valide enfin toutes ces modifications dans la version 1.6 du fichier, dans le référentiel :
Tronc principal 1.1 à 1.2à 1.3à 1.4à 1.5à 1.6
Branche 1.2.4 1.2.4.1à 1.2.4.2à 1.2.4.3 étiquette SITE_PILOTE
Puis, la branche SITE_PILOTE et le tronc principal peuvent chacun continuer à