tuteurs.ens.fr/logiciels/cvs/index.tml

587 lines
16 KiB
XML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html
PUBLIC "-//ENS/Tuteurs//DTD TML 1//EN"
"tuteurs://DTD/tml.dtd">
<html>
<head>
<title>CVS</title>
</head>
<body>
<h1>Le contrôle de versions avec CVS</h1>
<p><code>CVS</code> est un logiciel Unix pour gérer différentes versions
de beaucoup de fichiers produits éventuellement par de multiples
utilisateurs.</p>
<p>
Par exemple, les tuteurs informatique utilisent <code>CVS</code> pour
gérer ce site.
</p>
<h2>Pourquoi CVS&nbsp;?</h2>
<h3>L'enfer, c'est les autres</h3>
<p>
Supposons par exemple que vous conceviez un mémoire de maîtrise en
collaboration avec un camarade, ou encore que vous écriviez un programme
informatique en collaboration avec une équipe de développeurs. Plusieurs
scénarii-catastrophes peuvent être envisagés, et vous pouvez être sûr
qu'au moins l'un d'entre eux se réalisera tôt ou tard&nbsp;:
</p>
<ol>
<li> l'un des contributeurs efface par erreur tout ou partie du travail
commun mené jusque là, alors même que vous approchiez de son
terme&nbsp;;</li>
<li> un contributeur apporte des corrections à une version obsolète du
travail commun, car il ne savait pas où trouver la version la plus
récente&nbsp;;</li>
<li> deux contributeurs travaillaient simultanémlent sans le savoir, et
le deuxième a effacé sans le vouloir tout le travail du
premier&nbsp;;</li>
<li> un contributeur a commis de nombreuses erreurs, et l'on doit
revenir sur chacune de ses modifications, en espérant ne pas laisser
d'erreurs&nbsp;; </li>
<li>etc., etc.</li>
</ol>
<h3>La solution&nbsp;: CVS</h3>
<p>
L'idéal, pour éviter ces problèmes, serait de pouvoir concilier deux
exigences apparemment contradictoires&nbsp;:
</p>
<ol>
<li> centraliser les versions officielles pour éviter toute
ambiguïté&nbsp;;</li>
<li> décentraliser les versions de travail, sur lesquelles les
contributeurs apportent leurs modifications.</li>
</ol>
<p>
CVS réunit ces deux avantages, en respectant les principes
suivants&nbsp;:
</p>
<ol>
<li> centralisation des versions officielles&nbsp;;</li>
<li> numérotation des versions&nbsp;;</li>
<li> possibilité de retour à une version antérieure&nbsp;;</li>
<li> gestion des conflits entre deux modifications contradictoires des
mêmes fichiers&nbsp;;</li>
<li> décentralisation des répertoires de travail, ce qui permet à
plusieurs utilisateurs de travailler simultanément, et de ne pas
officialiser les modifications tant qu'elles ne sont pas terminées.</li>
</ol>
<p>
Pour vous initier à CVS, nous allons successivement vous présenter
comment mettre un projet sous CVS, puis comment travailler au quotidien
sous CVS.
</p>
<h2>Préliminaires à l'utilisation de CVS</h2>
<p>
Pour mettre des projets sous CVS, il faut procéder en deux temps&nbsp;:
</p>
<ol>
<li> créer un répertoire de dépôt&nbsp;CVS (en anglais
<em>repository</em>), où seront stockées toutes les versions officielles
et leurs modifications&nbsp;;</li>
<li> ajouter à ce répertoire les différents projets que vous voulez
mener à l'aide de CVS.</li>
</ol>
<h3>Créer un répertoire de dépôt&nbsp;CVS (<em>repository</em>)</h3>
<p>
Commençons par créer un répertoire de dépôt, c'est-à-dire un répertoire
où CVS stocke toutes les versions et leurs
modifications. Rassurez-vous&nbsp;: CVS investit toute son ingéniosité
pour réduire au maximum l'espace disque utilisé, en ne retenant <em>que
les modifications</em>, au lieu de recopier à chaque fois l'intégralité
des fichiers d'un projet.
</p>
<p>
Pour cela, il faut d'abord créer matériellement ce répertoire, par
exemple <code>$HOME/cvs</code>, puis créer la variable d'environnement
CVSROOT&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~ $</span> mkdir $HOME/cvs
<span class="prompt">bireme ~ $</span> CVSROOT="$HOME/cvs"
<span class="prompt">bireme ~ $</span> export CVSROOT
</pre>
<p>
Mais attention&nbsp;! dans ce cas, la variable CVSROOT disparaîtra quand
vous vous déloguerez ou fermerez le terminal courant. Aussi faut-il
écrire dans votre fichier <code>.profile</code> (au moins dans le cas de la
configuration des machines de l'ENS ; sur une machine personnelle ça peut
être différent)&nbsp;:
</p>
<pre>
CVSROOT="$HOME/cvs"; export CVSROOT
</pre>
<p class="continue">
Une fois que ce répertoire existe, il faut «&nbsp;faire les
présentations&nbsp;» avec CVS. Tapez&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~ $</span> cd cvs
<span class="prompt">bireme ~/cvs $</span> cvs init
</pre>
<p>
Maintenant, vous avez un répertoire de dépôt prêt à recevoir et à
stocker les différents projets. Il ne reste plus qu'à le remplir&nbsp;!
</p>
<p>
Plusieurs fois, <strong>cvs ouvrira un éditeur de texte</strong> en vous
demandant de commenter ce que vous êtes en train de
faire. <strong>Commentez vos modifications d'une avec un peu de
précision</strong>&nbsp;: évitez par exemple d'écrire simplement
«&nbsp;modifications diverses&nbsp;», mais plutôt «&nbsp;orthographe,
typographie, paragraphe sur&nbsp;X ou&nbsp;Y, fontion&nbsp;Z ou&nbsp;T,
etc.&nbsp;» L'objectif est qu'un autre contributeur (ou vous-même à une
date ultérieure) puisse ne lire <em>que</em> ce commentaire et savoir la
nature de vos modifications.
</p>
<h3>Créer un projet</h3>
<p>
Supposons que vous soyez en train de concevoir un projet nommé
«&nbsp;turing-test&nbsp;», dont tous les fichiers sont réunis dans le
répertoire <code>$HOME/programmation/turing-test</code>.
</p>
<p>
Tapez&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~ $</span> cd programmation/turing-test
<span class="prompt">bireme ~/programmation/turing-test $</span> cvs import turing votre_nom version0
</pre>
<p>
Ainsi est créé un répertoire <code>$HOME/cvs/turing</code>
contenant des fichiers correspondant à ceux du répertoire
<code>$HOME/programmation/turing-test</code>.
</p>
<p>
La mention <code>votre_nom</code> vous désigne&nbsp;; vous pouvez mettre
votre login, ou autre chose si vous préférez.
</p>
<p>
Quant à la mention <code>version0</code>, il s'agit juste d'un nom pour
la version initiale&nbsp;: vous pouvez tout aussi bien mettre
<code>start</code>, <code>debut</code>, etc. Seule contrainte&nbsp;: le
premier caractère doit être une lettre.
</p>
<h3>Créer un répertoire de travail</h3>
<p>
Maintenant que vous avez créé votre projet sous CVS, vous pouvez vous
créer un répertoire de travail.
</p>
<pre>
<span class="prompt">bireme ~ $</span> mkdir rep-travail
<span class="prompt">bireme ~ $</span> cd rep-travail
<span class="prompt">bireme ~/rep-travail $</span> cvs checkout turing
</pre>
<p>
La commande <code>cvs&nbsp;checkout&nbsp;<em>projet</em></code> crée un
répertoire de travail pour le projet indiqué. <strong>Vous pouvez en
créer autant que vous voulez</strong> (si vous en avez vraiment
l'utilité...). En particulier, plusieurs utilisateurs différents peuvent
en créer&nbsp;: c'est précisément ce qui fait l'intérêt de CVS.
</p>
<h2>CVS au quotidien</h2>
<h3>Mettre à jour son répertoire de travail</h3>
<p>
Avant de modifier les fichiers mis sous CVS, vous devrez à chaque fois
les mettre à jour, ce qui vous permet de partir de versions récentes de
ces fichiers. Pour mettre à jour votre répertoire de travail,
tapez&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/turing-test $</span> cvs update turing
</pre>
<p class="continue">
Vous serez alors sûr d'avoir des fichiers à&nbsp;jour.
</p>
<p>
Vous pouvez aussi ne mettre à jour qu'un fichier, ou une liste de
fichiers&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/turing-test $</span> cvs update <em>fichier1 fichier2 etc</em>
</pre>
<p>
Vous pouvez encore indiquer en ligne de commande quel répertoire mettre
à jour&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/turing-test $</span> cvs update -d ~/programmation/turing-test
</pre>
<p>
Cette dernière commande peut être intégrée à un script, ce qui est très
pratique si vous voulez que les modifications soient prises en compte à
plusieurs endroits différents (par exemple, dans votre répertoire de
travail et sur votre page web, si vous avez mis votre page web
sous&nbsp;CVS).
</p>
<h3>Ajouter des fichiers</h3>
<p>
Un projet est rarement fixé dès sa première version&nbsp;; aussi des
fichiers peuvent-ils s'ajouter aux fichiers intégrés à l'origine (avec
la commande <code>cvs&nbsp;import</code>), d'autres en être retirés.
</p>
<p>
Pour ajouter des fichiers, la façon de s'y prendre dépend de la nature
du fichier en question. En effet, si le fichier est un fichier binaire,
il ne sert à rien que CVS le lise ligne à ligne à chaque partage de
modifications pour vérifier s'il a changé&nbsp;; tandis que s'il s'agit
d'un fichier texte, CVS est là pour ça.
</p>
<p>
Par conséquent, si c'est un <strong>fichier texte</strong> (un texte
simple, un script, le code source d'un programme, un fichier TeX, etc.),
tapez&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/turing-test $</span> cvs add <em>fichier1 fichier2 etc</em>
</pre>
<p class="continue">
En revanche, si vous voulez <strong>ajouter un fichier binaire</strong>
(un fichier exécutable, un document PS, PDF, une image JPEG, PNG, etc.),
tapez&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/turing-test $</span> cvs add -kb <em>fichier1 fichier2 etc</em>
</pre>
<p>
Vous pouvez <strong>vérifier le statut</strong> des fichiers (binaires
ou non) avec la commande&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/turing-test $</span> cvs status <em>fichier</em>
</pre>
<p class="continue">
Lisez le champ «&nbsp;Sticky Options&nbsp;». Si sa valeur est
«&nbsp;(none)&nbsp;», c'est que votre fichier n'est pas déclaré comme
binaire&nbsp;; s'il vaut «&nbsp;-kb&nbsp;», c'est qu'il l'est.
</p>
<p>
Il arrive parfois que l'on oublie de déclarer comme binaires certains
fichiers, notamment lors de l'enregistrement du projet dans le
répertoire de dépôt&nbsp;CVS. Il n'est pas trop tard pour se
rattraper&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/turing-test $</span> cvs update -kb <em>fichier1 fichier2 etc</em>
</pre>
<p class="continue">
Ce qui équivaut à la succession de commandes suivante&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/turing-test $</span> cvs admin -kb <em>fichier1 fichier2 etc</em><br/>
<span class="prompt">bireme ~/turing-test $</span> cvs update <em>fichier1 fichier2 etc</em>
</pre>
<h3>Retirer des fichiers</h3>
<p>
Pour retirer des fichiers, utilisez la commande&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/turing-test $</span> cvs remove <em>fichier1 fichier2 etc</em>
</pre>
<h3>Partager les modifications</h3>
<p>
Quand vous avez terminé vos modifications et que vous estimez que le
monde est prêt à les recevoir, partagez-les&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/turing-test $</span> cvs commit
</pre>
<p class="continue">
Les modifications seront alors enregistrées dans le répertoire de dépôt.
</p>
<p>
Vous pouvez aussi ne partager qu'un fichier, ou une liste de
fichiers&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/turing-test $</span> cvs commit <em>fichier1 fichier2 etc</em>
</pre>
<p>
Quand vous partagez vos modifications, un éditeur de texte s'ouvre et
vous demande de les commenter. Vous n'êtes pas obligé d'être bavard,
mais soyez relativement précis.
</p>
<h3>Nettoyer son répertoire de travail</h3>
<p>
Si vous ne contribuez qu'occasionnellement à tel ou tel projet, vous
pouvez vouloir ne pas conserver en permanence une version d'un projet
donné dans votre répertoire de travail. Pour vous en débarrasser, vous
avez bien sûr la possibilité d'effacer les fichiers d'une manière
«&nbsp;traditionnelle&nbsp;», au moyen de la commande
<code>rm</code>. Mais CVS propose un outil plus puissant&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/turing-test $</span> cvs release -d turing
</pre>
<p>
Cette commande <strong>vérifie que vous avez bien partagé toutes vos
modifications avant d'effacer les fichiers de votre répertoire de
travail</strong>. Ceci vous épargne bien des migraines&nbsp;!
</p>
<p>
Si vous ne voulez pas effacer vos fichiers, mais simplement
<strong>vérifier qu'aucun fichier n'a été modifié sans être
partagé</strong>, tapez simplement&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/turing-test $</span> cvs release turing
</pre>
<p class="continue">
Cette commande annule le <code>cvs checkout</code>.
</p>
<h2>Fonctionnalités avancées de CVS</h2>
<h3>Historique des modifications</h3>
<p>
CVS garde l'historique de toutes les modifications. Si vous voulez voir
l'historique complet, tapez&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/turing-test $</span> cvs log
</pre>
<p>
Vous pouvez aussi ne consulter l'historique que d'un fichier, ou d'une
liste de fichiers&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/turing-test $</span> cvs log <em>fichier1 fichier2 etc</em>
</pre>
<p>
Devant vos yeux ébahis s'affichera alors la liste de toutes les versions
de ces fichiers, accompagnées des commentaires déposés par les
contributeurs.
</p>
<h3>Comparer des versions</h3>
<p>
Vous voulez savoir précisément en quoi telle version d'un fichier
diffère de telle autre&nbsp;; pour cela, tapez&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/turing-test $</span> cvs diff -r 1.2 fichier
</pre>
<p>
Ainsi, vous pourrez comparer l'état actuel du fichier avec sa
version&nbsp;1.2. Mais vous pouvez aussi comparer deux versions
quelconques&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/turing-test $</span> cvs diff -r 1.1 -r 1.2 fichier
</pre>
<h3>Revenir sur des modifications</h3>
<p>
Oups&nbsp;! Vous avez fait une erreur, et dans votre précipitation, vous
l'avez déjà partagée. Heureusement, CVS permet de revenir à des versions
antérieures. Tapez&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/turing-test $</span> cvs update -A fichier
<span class="prompt">bireme ~/turing-test $</span> rm fichier
<span class="prompt">bireme ~/turing-test $</span> cvs update -p -r1.1 fichier > fichier
<span class="prompt">bireme ~/turing-test $</span> cvs commit fichier
</pre>
<h3>Astuce&nbsp;: utiliser l'outil <code>make</code></h3>
<p>
Imaginons la situation suivante&nbsp;: vous avez un site web sur lequel
vous voulez travailler à l'aide de CVS. Vous avez donc un répertoire de
dépôt (par exemple <code>~/cvs/www</code>) et un répertoire de travail
(par exemple <code>~/cvs-travail/www</code>). Mais vous voulez aussi
mettre à jour le site en lui-même lorsque vous partagez des
modifications, et ce site est dans le répertoire <code>~/www</code>. Ce
répertoire ne peut pas être le même que pour le dépôt, car celui-ci
doit lui être exclusivement consacré&nbsp;; et il ne peut pas non plus
être votre répertoire de travail, car la moindre modification (et
surtout la moindre erreur) serait immédiatement publiée...
</p>
<p>
Vous devrez donc taper, à chaque fois que vous voudrez partager vos
modifications, les lignes suivantes&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/cvs-travail/www $</span> cvs commit
<span class="prompt">bireme ~/cvs-travail/www $</span> cvs update -d ~/www
</pre>
<p class="continue">
Le problème, c'est que cette séquence de commandes sera toujours la même
et que vous risquerez toujours d'en oublier une sur les deux... Aussi
avez-vous la possibilité d'utiliser l'utilitaire <code>make</code>,
outil très puissant, notamment dans ces circonstances (il est très
utilisé par les programmeurs).
</p>
<p>
Commencez donc par <strong>éditer un fichier Makefile</strong> dans le répertoire souche
de votre projet dans le répertoire de travail&nbsp;; dans notre exemple,
il s'agit de ~/cvs-travail/www. Dans ce fichier, écrivez&nbsp;:
</p>
<pre>
install:
cvs commit
cvs update -d /users/<em>ma_promo</em>/<em>ma_section</em>/<em>mon_login</em>/www
</pre>
<p>
Ensuite, ajoutez ce fichier Makefile au CVS&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/cvs-travail/www $</span> cvs add Makefile
</pre>
<p>
Et à partir de maintenant, au lieu de taper <code>cvs&nbsp;commit</code>
pour partager vos modifications, vous taperez simplement&nbsp;:
</p>
<pre>
<span class="prompt">bireme ~/cvs-travail/www $</span> make install
</pre>
<p class="continue">
et <code>make</code> se chargera de tout à votre place&nbsp;!
</p>
<p>
Vous êtes maintenant prêt à utiliser CVS. Sa puissance est telle que cet
outil est devenu l'un des standards incontournables. Profitez-en
bien&nbsp;!
</p>
<h2>Bibliographie</h2>
<p>
Vous pouvez accéder à la petite documentation rédigée par David Monniaux
<a href="doc-cvs.ps.gz">(au format <code>.ps.gz</code>)</a>.
</p>
<p>
La documentation officielle se trouve <a
href="http://www.cvshome.org/docs/manual/">là-bas</a>.
</p>
<div class="metainformation">
Auteurs : Baptiste Mélès, Joël Riou. Dernière modification le
<date value="$Date: 2005-11-04 15:01:06 $" />.
</div>
</body>
</html>