Le suivi des versions de projet avec CVS
Le système collaboratif de gestion des versions (Concurrent Versions System, en anglais) est un outil open-source puissant pour la maintenance du code source d’un projet collaboratif. Il est fourni avec le CD des Outils de Développement qui accompagne Mac OS X ou fait partie des Outils de Développement de Mac OS X disponibles en ligne. Cet article couvre les fonctionnalités les plus couramment utilisées de CVS, avec un accent mis sur son utilisation avec des fichiers web statiques et interprétés (HTML, PHP, Perl, etc…).
CVS Vue d’ensemble et Terminologie
Avant de commencer, prenez un moment pour passer en revue quelques appellations communes de CVS. Un repository (dépôt) est un endroit où CVS garde les copies maîtresses (master) de tous les fichiers qu’il connaît, y compris les informations relatives aux évolutions de ces fichiers. Un project ou module est un ensemble de fichiers qui appartiennent au même ensemble, comme tous les fichiers qui composent un site Web particulier. Pour faire un checkout d’un projet, il faut faire une copie locale de tous les fichiers liés de manière à pouvoir effectuer des changements, et les tester sur votre propre système, sans affecter le travail des autres. Faire un commit (engagement) revient à sauvegarder vos changements sur le repository, où ils seront alors disponibles aux autres (ou à vous, dans le cas où vous souhaiteriez revenir à une version précédente).
Démarrage
CVS est compris dans Mac OS X, vous n’avez donc rien de nouveau à installer si vous avez installé les programmes qui sont sur le CD des Outils de Développement ou si vous les avez téléchargés sur http://developer.apple.com/tools/.
Pour commencer, créez un nouveau répertoire pour votre dépôt CVS en passant sous l’utilisateur root :
liz@localhost:~> sudo sh Password: root@localhost:~> mkdir /usr/local/cvsrep
Maintenant, regardez le propriétaire et le groupe positionnés par défaut sur le répertoire que vous venez juste de créer :
root@localhost:~> ls -ld /usr/local/cvsrep drwxr-xr-x 3 root wheel 58 Dec 9 21:30 /usr/local/cvsrep
Comme vous le voyez ci-dessus, le nouveau répertoire appartient à l’utilisateur root et au groupe wheel. Vous devez vous assurer que vous pourrez écrire dans ce répertoire même quand vous ne travaillerez pas sous l’utilisateur root. Vous voudrez probablement faire en sorte que votre répertoire CVS soit accessible à l’utilisateur primaire de votre système. Lors de mon installation de Mac OS X, Liz fut le premier compte créé et, par défaut, Mac OS X a attribué Liz au groupe wheel et à d’autres groupes administratifs :
root@localhost:~> groups liz staff wheel admin
Les instructions qui suivent marchent sur la plupart des installations Mac OS X à utilisateur unique. Vous pouvez aussi en savoir plus sur le CVS en mode multiposte ici.
D’abord vous devez changer les permissions du répertoire récemment créé pour que l’utilisateur par défaut du système puisse y lire et y écrire.
root@localhost:~> chmod g+w /usr/local/cvsrep root@localhost:~> exit liz@localhost:~>
Créez maintenant la variable d’environnement shell CVSROOT. Cette variable indique à CVS où réside le repository (dépôt). (Note : si vous ne connaissez pas le shell que vous employez, c’est probablement tcsh).
Sous bash ou sh, la commande est :
liz@localhost:~> export CVSROOT=/usr/local/cvsrep
Ou, sous tcsh :
liz@localhost:~> setenv CVSROOT "/usr/local/cvsrep"
Une autre variable d’environnement que j’aime aussi changer est : CVSEDITOR, de manière à tout le temps utiliser mon éditeur de texte préféré, emacs. Si vous préférez vi (par défaut), vous pouvez ignorer cette variable. Si vous êtes novice dans le monde Unix, vous souhaiterez plutôt utiliser un programme simple comme pico. Plus tard dans cet article vous verrez comment employer CVS avec BBEDIT.
liz@localhost:~> export CVSEDITOR=emacs
Ou, dans tcsh:
liz@localhost:~> setenv CVSEDITOR "emacs"
Maintenant, vous êtes prêt à créer votre dépôt CVS avec la commande cvs init :
liz@localhost:~> cvs init liz@localhost:~>
Dès que vous fermerez la fenêtre terminale courante, vous perdrez la variable d’environnement CVSROOT. Cela signifie, que la prochaine fois que vous essayerez d’utiliser CVS, vous verrez un message d’erreur dans ce style :
cvs import: No CVSROOT specified! Please use the `-d' option cvs [import aborted]: or set the CVSROOT environment variable.
Il y a trois façons d’éviter cette erreur. Vous pouvez régler manuellement les variables CVSROOT (et éventuellement CVSEDITOR) à chaque fois que vous voulez employer CVS. Ou, vous pouvez ajouter le commutateur -d /usr/local/cvsrep à vos commandes CVS. Cependant, l’option la plus facile à la longue est d’insérer la commande export ou la commande setenv précédente dans votre fichier de démarrage shell. Voir la page man de votre shell par défaut en tapant, par exemple, man sh ou man tcsh, si vous ne savez pas comment créer un fichier de démarrage.
Création de votre premier projet
Une fois que vous avez initialisé CVS, vous pouvez créer un nouveau projet. D’abord, créez un répertoire appelé “myproj” sous votre répertoire domestique (~):
liz@localhost:quelquepart> cd ~ liz@localhost:~> mkdir myproj liz@localhost:~> cd myproj
Maintenant vous pouvez créer un nouveau fichier appartenant à votre projet. En guise d’essai, créez un fichier HTML appelé ~/myproj/index.html avec quelque ligne de texte basique :
<html><head><title>First</title></head> <body bgcolor="white"> <h1>Premier fichier du premier projet CVS</h1> </body> </html>
Maintenant vous pouvez ajouter ce nouveau projet à votre dépôt CVS en employant la commande import :
liz@localhost:myproj>cvs import -m "My First Project" myproj vendor-tag start N myproj/index.html No conflicts created by this import liz@localhost:myproj>
Vous pouvez en apprendre plus sur le vendor-tag facultatif ici.
Création de copies vivantes d’un Projet
Maintenant que vous avez créé un nouveau projet CVS contenant un simple fichier, vous (ainsi que d’autres personnes) pouvez employer la commande checkout pour faire des copies vivantes du projet. Vous pouvez ainsi apporter des changements au projet et les tester. Puis, une fois que vous serez satisfait des modifications, remettez les changements au dépôt principal.
Un lieu sensible pour tester les copies de projets web est votre répertoire Web individuel. Par défaut, ce répertoire est /home/username/Sites/. En supposant qu’Apache fonctionne sur votre machine Mac OS X, les fichiers placés dans ce répertoire peuvent être vus dans un navigateur Internet via l’adresse http://localhost/~utilisateur.
C’est ainsi que je vérifie la nouvelle copie d’un projet dans mon répertoire ~/Sites :
liz@localhost:~> cd ~/Sites liz@localhost:Sites> cvs checkout myproj cvs checkout: Updating myproj U myproj/index.html liz@localhost:Sites> cd myproj
Vous pouvez maintenant voir cette page dans votre navigateur :

À ce point, vous pouvez supprimer le fichier original du projet de votre répertoire domestique (~/myproj/index.html) si vous le souhaitez. Le fichier est maintenant dans le dépôt CVS et vous pouvez le tester chaque fois que vous le désirez.
Effectuer des Changements
Maintenant vous pouvez apporter quelques changements à votre copie locale de myproj/index.html, qui se trouve dans le répertoire ~/Sites. Par exemple, vous pourriez ajouter une ligne de texte :
<html><head><title>First</title></head> <body bgcolor="white"> <h1>Le Premier Fichier du Premier Projet de CVS </h1> J'ai ajouté ce texte au fichier. </Body > < / HTML >
Une fois que vous avez effectué les changements, remettez le fichier mis à jour au dépôt. CVS s’attend à ce que vous fournissiez un commentaire avec votre remise dont le but est de récapituler le travail que vous avez fait. Si vous ne fournissez pas de commentaire en employant l’option -m, CVS vous ménera dans un éditeur de texte (voir CVSEDITOR ci-dessus) et attendra que vous tapiez et sauvegardiez un commentaire avant de procéder à la mise à jour.
liz@localhost:myproj> cvs commit -m "updated index.html" index.html Checking in index.html; /usr/local/cvsrep/myproj/index.html,v <-- index.html new revision: 1.2; previous revision: 1.1 done
Ajout et suppression de fichiers
Quand il devient opportun d’ajouter de nouveaux fichiers à votre projet, vous pouvez les créer dans le répertoire ~/Sites/myproj/ et les importer en employant la commande CVS add :
liz@localhost:myproj> cvs add another.html cvs add: scheduling file `another.html' for addition cvs add: use 'cvs commit' to add this file permanently liz@localhost:myproj> liz@localhost:myproj> cvs commit -m "added another.html" cvs commit: Examining . RCS file: /usr/local/cvsrep/myproj/another.html,v done Checking in another.html; /usr/local/cvsrep/myproj/another.html,v <-- another.html initial revision: 1.1 done
Si vous voulez enlever un fichier d’un projet, supprimez d’abord le fichier lui-même, et dites ensuite à CVS qu’il a été supprimé :
liz@localhost:myproj> rm another.html liz@localhost:myproj> cvs remove another.html cvs remove: scheduling `another.html' for removal cvs remove: use 'cvs commit' to remove this file permanently liz@localhost:myproj> cvs commit -m "removed another.html" cvs commit: Examining . Removing another.html; /usr/local/cvsrep/myproj/another.html,v <-- another.html new revision: delete; previous revision: 1.1 done liz@localhost:myproj>
Reconstitution d’une version précédente
Si vous voulez retrouver l’état d’un projet à un instant donnée dans le passé, vous pouvez employer l’option -D. Par exemple, pour retrouver l’état du projet à une certaine date et une certaine heure, créer un nouveau répertoire (ou déplacer ou supprimer vos fichiers existants) et tapez cvs checkout -D date project. Par exemple :
liz@localhost:Sites> cvs checkout -D "2001-11-29 18:00" myproj cvs checkout: Updating myproj U myproj/index.html
Travailler avec des projets multiples
Votre dépôt CVS peut contenir autant de projets que la capacité de votre disque dur le permettra. Vous n’avez qu’à créer des nouveaux projets avec la commande cvs import. Quand vous voulez vérifier la version d’un projet, faites cd vers le répertoire local de votre projet et lancez une commande CVS commit, add, remove, etc. En réalité, il n’y a aucune raison qui vous empêche d’avoir plusieurs dépôts CVS. Vous pouvez spécifier des dépôts différents en employant l’option -d ou en changeant la variable d’environnement CVSROOT. Tous les exemples de cet article, cependant, supposent qu’il n’y a qu’un seul dépôt local.
Utilisation de CVS avec BBEDIT 6.5
Traditionnellement, les développeurs Internet Mac emploient BBEDIT pour développer des fichiers en local, puis les transmettent par FTP vers un serveur éloigné. Mais BBEDIT 6.5 tourne nativement sur Mac OS X et il supporte les scripts UNIX en mode intégré. Cela signifie que vous pouvez écrire des scripts shell simples pour avoir accès à CVS sans quitter BBEDIT.
Pour lancer un script shell Unix à l’intérieur BBEDIT 6.5 ou supérieur, vous emploierez l’option de menu intitulée #! (souvent prononcée “shebang”). D’abord, créez un répertoire pour y mettre vos scripts.
liz@localhost:~> mkdir scripts
Maintenant vous pouvez créer un fichier appelé, par exemple, “commit” dans ~/scripts. Si vous envisagez de travailler avec des projets multiples, vous pouvez donner au fichier un nom plus spécifique, comme”myproj_commit“. Le fichier aurait le contenu suivant :
#!/bin/sh cd ~/Sites/myproj cvs -d /usr/local/cvsrep commit
Pour lancer votre nouveau script, choisissez Run File à partir du menu shebang de BBEDIT. La première fois que vous le lancez, vous devez indiquer à BBEDIT où se trouve le script. A l’avenir, BBEdit se rappellera des scripts récemment exécutés et vous les proposera.
Utilisation des branches CVS
Les branches peuvent être utiles même pour la plus simple des applications web. Par exemple, vous pouvez publier la version d’un site tandis que vous travaillez sur la version suivante. Avec des branches CVS, non seulement vous pouvez garder la trace de publications multiples, mais vous pouvez aussi facilement référencer vos différentes versions, faire des corrections et de la maintenance beaucoup plus facilement. Vous pouvez créer des branches en employant l’option -b de la commande cvs tag.
liz@localhost:myproj> cvs tag -b phase_one cvs tag: Tagging myproj T myproj/index.html
Maintenant que vous avez étiqueté le projet pour la première fois, vous devez passer à l’étape suivante : publiez votre répertoire de travail courant et soumettre une nouvelle copie du projet, en spécifiant le nouveau nom de branche (l’option -d supprime les fichiers en cours d’utilisation) :
liz@localhost:Sites> cvs release -d myproj You have [0] altered files in this repository. Are you sure you want to release (and delete) directory `myproj': y liz@localhost:Sites> cvs checkout -r phase_one myproj cvs checkout: Updating myproj U myproj/index.html
Publication de Code avec CVS
Si vous regardez votre répertoire projet dans ~/Sites/myproj, vous verrez que vos fichiers source ne sont pas les seuls présents. Il y a aussi des fichiers CVS administratifs et des répertoires :
liz@localhost:myproj>ls -l total 8 drwxr-xr-x 5 liz staff 264 Dec 11 23:23 CVS -rw-r--r-- 1 liz staff 125 Dec 12 17:19 index.html
Ceux-ci sont nécessaires quand vous travaillez sur un projet, mais vous ne souhaiterez pas vraiment qu’ils fassent partie de votre site Web au moment de sa publication. Pour obtenir la copie d’un projet sans données CVS additionnelles, vous pouvez employer la commande export de CVS. Par exemple, voici comment j’exporterais mon projet web vers la racine de mon serveur Apache. Note : je spécifie now comme date parce que l’exportation attend soit un libellé de branche soit une date.
liz@localhost:~> cd /Library/WebServer/Documents liz@localhost:Documents> cvs export -D "now" myproj cvs export: Updating myproj U myproj/index.html liz@localhost:Documents> cd myproj liz@localhost:myproj>ls -l total 8 -rw-r--r-- 1 liz staff 186 Dec 12 20:29 index.html
Utilisation de CVS avec plusieurs développeurs
CVS permet à plusieurs personnes de travailler sur le même fichier en même temps. En fait, si deux personnes font des changements sur le même fichier et le soumettent, CVS essayera de mixer les deux changements. Si CVS ne peut pas mixer vos changements (par exemple, deux personnes ont toutes les deux changé le même secteur du même fichier), il vous indiquera que vous avez besoin d’éditer manuellement le fichier - et probablement communiquer avec l’autre développeur - pour résoudre le conflit.
Si beaucoup de personnes ont accès au même dépôt CVS sur la même machine, il permet de créer un nouveau groupe de connexion CVS pour que tous les développeurs puissent avoir accès en écriture au dépôt.
Pour créer un nouveau groupe sous Mac OS X, lancez l’application NetInfo Manager située dans /Applications/Utilities et suivez ces étapes :
- Cliquez sur l’icône de cadenas et entrez votre mot de passe administrateur pour effectuer les changements.
- Cliquez sur “groups” dans le navigateur de répertoires pour afficher les groupes.
- Vous allez faire une copie d’un groupe existant et le rebaptiser. Cliquez d’abord sur “deamon”.
- Cliquez sur l’icône “Dupliquer le répertoire sélectionné” (l’image constituée de deux dossiers).
- Cliquez sur le nom du nouveau groupe dans la colonne “Valeurs” et changez son nom en “cvs-user”.
- Changez l’id du groupe (gid) avec un numéro qui n’a pas été encore employé, comme 501.
- Mettez en évidence le champ “users” dans la colonne “Propriété(s)”.
- Pour chaque utilisateur que vous voudrez associer à ce groupe, choisissez “Insérer une valeur” du menu “Répertoire”. Double cliquez sur la valeur nouvellement insérée et attribuez lui le nom court de l’utilisateur à associer au groupe.
Quand vous avez fini, vous devez voir une fenêtre ressemblant à celle ci-dessous (”liz” et “jay” sont les deux utilisateurs que j’ai associés au groupe “cvs-user”) :

Une fois fini, vous pouvez retourner dans le shell pour confirmer que les utilisateurs “liz” et “jay” sont les membres du groupe cvs-user :
liz@localhost:~groups liz staff wheel admin cvs-user liz@localhost:~>groups jay staff cvs-user
Finalement, changez la propriété de groupe de votre dépôt CVS pour que les membres de votre nouveau groupe cvs-user puissent y avoir accès :
liz@localhost:~>sudo chgrp cvs-user /usr/local/cvsrep Password:
CVS propose plusieurs commandes utiles pour la collaboration multi-développeur. Parmis celles-ci, cvs status affiche des informations sur des fichiers que vous avez changés et qui ont aussi été changés par d’autres, cvs release indique à CVS que vous avez fini de travailler sur un projet, et cvs update qui met à jour la copie du projet sur laquelle vous travaillez pour refléter les changements effectués par d’autres. Pour en savoir plus sur celles-ci allez voir les suggestions pour des lectures approfondies (en anglais).
Utilisation de CVS au travers d’un réseau
Jusqu’ici, vous avez appris à manipuler des dépôts et des projets stockés sur votre machine locale Mac OS X. CVS vous permet aussi de manipuler des dépôts situés sur d’autres machines sur Internet, à condition qu’elles aient lancé quelques services.
Pservers CVS
Vous pouvez prendre contrôle de fichiers situés sur un dépôt distant en ayant accès à un pserver CVS public (serveur de mot de passe). Beaucoup de pservers, particulièrement ceux pour des projets open-source, permettent un accès en lecture seule sous l’identifiant “anonymous” avec le mot de passe “anonymous”. Vous pouvez avoir accès à un serveur distant (indiqué avec l’option -d) en utilisant d’abord la commande login, suivie par la commande checkout.
liz@localhost:Sites> cvs -d :pserver:anonymous@ remote_server:/path/to/repository login CVS password: anonymous liz@localhost:Sites> cvs -d :pserver:anonymous@remote_server: /path/to/repository checkout module_name
Il y a cependant un inconvénient significatif à l’utilisation de cette méthode pour des accès autres qu’anonymes. Les pservers CVS transmettent le nom d’identifiant de la connexion et le mot de passe de manière non chiffrée. Les fichiers de module sont transmis en clair aussi. Cela signifie que n’importe quelle personne mal intentionnée qui peut se brancher sur réseau a un accès total non seulement aux informations d’établissement de la connexion, mais aussi à vos données.
Il y existe des manières pour ne paramétrer que les identifiants et mots de passe cvs (voir les suggestions pour des lectures approfondies pour cela), mais il serait peut être mieux, à mon avis, de se servir de CVS au travers d’une connexion entièrement chiffrée. Pour cela, vous pouvez employer ssh (le shell sécurisé).
Sécurisez CVS via ssh
Il est simple d’employer entièrement CVS sous ssh. Si vous réglez la variable d’environnement CVS_RSH (CVS Remote Shell) sur “ssh“, vous pouvez lancer des commandes CVS sans crainte au travers d’Internet, comme si vous les lanciez en local. Les utilisateurs Mac OS X 10.1 disposent de ssh et scp (copie sécurisée) par défaut. Si vous employez une version précédente de Mac OS X, vous pouvez visiter http://www.openssh.com/ pour obtenir ssh.
Si vous voulez utiliser ssh sans devoir taper votre mot de passe à chaque fois (utile si vous avez accès à CVS via un script shell dans BBEDIT, par exemple), vous pouvez créer une paire clef publique/privée avec la commande ssh-keygen. L’avantage cette méthode consiste dans le fait que vos scripts pourront être lancés sans intervention humaine. L’inconvénient est que toute personne ayant accès à votre compte Mac OS X local sera aussi capable d’avoir accès aux serveurs distants qui ont stocké votre clef publique.
Les commandes exactes à entrer pour utiliser ssh-keygen dépendent de la version de ssh que vous possédez (1 ou 2). Si vous vous servez de la version 1, entrez les commandes suivantes. (Note : si vous frappez retour quand on vous demande une “phrase mot de passe” le processus s’arrêtera avec cette “phrase mot de passe” vide.)
liz@localhost:~> cd ~/.ssh liz@localhost:> ssh-keygen -t rsa1 Generating public/private rsa1 key pair. Enter file in which to save the key (/Users/liz/.ssh/identity): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /Users/liz/.ssh/identity. Your public key has been saved in /Users/liz/.ssh/identity.pub. The key fingerprint is: liz@localhost:.ssh>ls identity identity.pub
Et pour la version 2, faites ceci :
liz@localhost:~> ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/Users/liz/.ssh/id_dsa): Created directory '/Users/liz/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /Users/liz/.ssh/id_dsa. Your public key has been saved in /Users/liz/.ssh/id_dsa.pub. The key fingerprint is: liz@localhost:~>cd ~/.ssh liz@localhost:~> ls id_dsa id_dsa.pub
Une fois que vous avez créé vos clefs privées et publiques, vous devez placer votre clef publique en un lieu de l’hôte distant où ssh et scp pourront le reconnaître. Employez ssh pour vous connecter à l’hôte distant sur lequel vous voulez publier vos projets. Ajoutez alors le contenu de votre fichier ~/.ssh/identity.pub ou id_dsa.pub à un fichier de votre répertoire distant ~/.ssh appelé “authorized_keys” (si vous n’en avez pas, vous pouvez le créer).
Que vous ayez ou pas placé votre clef publique sur le serveur distant, vous pouvez lancer CVS en toute sécurité via ssh :
liz@localhost:Sites> export CVSROOT=":ext:your_login@ your_remote_server:/path/to/repository" liz@localhost:Sites> export CVS_RSH="ssh" liz@localhost:Sites> cvs checkout remote_module_name
Conclusion et Suggestions pour d’autres lectures
Dans cet article vous avez vu comment créer des dépôts et des projets CVS, ajouter et extraire des fichiers, faire des changements et les remettre et, avoir accès à CVS sur des serveurs autres que le propre. Il y a beaucoup d’autres fonctionnalités dans CVS que vous pourriez explorer et je vous encourage à suivre les liens ci-dessous pour en apprendre plus.
Pour plus d’informations sur CVS, visitez http://www.cvshome.org/. Le Manuel CVS Officiel est d’un intérêt particulier. Sur votre système Mac OS X local, vous trouverez aussi la documentation standard de CVS, quand vous tapez “man cvs“. Enfin, il y a aussi le livre de poche pratique CVS la Référence de Poche, écrit par Gregor N. Purdy et publié par O’Reilly.

Textes originaux en anglais sur developer.apple.com : Version Control with CVS on Mac OS X
© Juillet 2002 - Thierry pour Project:Omega
Chargement
Commentaires récents