Aller au contenu

Gestion de version/CVS

Un livre de Wikilivres.

Attention ! Ne pas confondre CVS et CSV

CVS, acronyme de Concurrent Versions System, est un logiciel libre (licence GPL) de gestion de version.

CVS est documentĂ© ici car il est le systĂšme de gestion de version le plus utilisĂ© de par son anciennetĂ©. Ses dĂ©fauts de conception ont donnĂ© naissance Ă  Subversion (SVN), ainsi qu'Ă  Darcs : tout deux Ă©galement libres.

Release : Supprimer proprement son espace de travail

[modifier | modifier le wikicode]

On peut faire autant de checkouts qu'on veut, et parfois on se retrouve avec beaucoup d'espaces de travail qui ne servent plus. Mais avant de supprimer un tel rĂ©pertoire, il faut faire attention Ă  ne pas perdre de travail. La commande suivante vĂ©rifie si le rĂ©pertoire ne contient pas de travaux non sauvegardĂ©s :

$ cvs release monprojet

Un résumé des éventuelles différences avec le repository apparaßt. Si aucune de celles-ci n'est intéressante, supprimer le répertoire.

Renommer ou déplacer un répertoire ou un fichier

[modifier | modifier le wikicode]

On ne peut pas. C'est une limitation conceptuelle de CVS. Il faut supprimer puis recrĂ©er. Dans le cas d'un rĂ©pertoire Ă  renommer, il faut crĂ©er un nouveau rĂ©pertoire et dĂ©placer les fichiers qui s'y trouvaient. Il ne faut pas supprimer l'ancien rĂ©pertoire, sous peine de perdre son historique, donc de perdre les versions antĂ©rieures ! Ce n'est pas grave de garder ce rĂ©pertoire car s’il est vide il ne sera pas créé lors des checkouts suivants.

Consulter une vieille version d'un fichier

[modifier | modifier le wikicode]

Restaurer une version précédente d'un fichier

[modifier | modifier le wikicode]

En principe, on n'a jamais besoin de le faire, mais ça peut arriver de vouloir annuler les modifications du dernier ou des derniers commit. Dans ce cas, bien identifier la version Ă  restaurer (par exemple 1.14) et taper les commandes :

$ cvs -Q update -p -r 1.14 fichier.c > fichier.c
$ cvs commit fichier.c

Convention : Dans le commentaire du commit, il peut ĂȘtre bon de placer la phrase « Reverted to 1.14 Â» pour se rappeler d'oĂč ça vient.

Ressusciter un fichier supprimé du repository

[modifier | modifier le wikicode]

AprĂšs un « cvs rm -f fichier.c Â» un peu trop expĂ©ditif, on peut toujours faire renaĂźtre le fichier, dans le repository et dans son rĂ©pertoire local. Il faut se souvenir du nom et de l'emplacement du fichier. Dans le rĂ©pertoire oĂč il se trouvait, taper la commande suivante :

$ cvs status fichier.c

Bien qu'il n'existe plus localement, cvs nous donne l'identifiant de la derniĂšre version du fichier sur le tronc commun :

$ File: no file fichier.c		Status: Up-to-date
$    Working revision:	No entry for fichier.c
$    Repository revision:	1.6	/tests/proj/d/Attic/fichier.c,v

L'information que nous recherchons est « Repository revision Â», qui a ici pour valeur « 1.6 Â». Utiliser cette valeur dans l'incantation suivante :

$ cvs -Q update -p -r 1.6 fichier.c > fichier.c

Le fichier est maintenant dans le rĂ©pertoire local. Il ne reste plus qu'Ă  l'ajouter (add) puis engager la mise Ă  jour du repository (commit) :

$ cvs add fichier.c
$ cvs commit

Dans le commentaire du commit, il peut ĂȘtre bon de placer la phrase « Resurrected from 1.6 Â» pour se rappeler d'oĂč ça vient.

History : Voir les derniĂšres actions effectuĂ©es sur le repository

[modifier | modifier le wikicode]

Quelqu'un a "commitĂ©" du code faux, et ça ne compile pas ? Pour connaĂźtre le nom du coupable, utilisez la commande suivante qui donne les liste des modifications sur le repository pendant les 3 derniers jours :

$ cvs history -ca -D "3 days ago"

Cette commande donne toutes les opĂ©rations de lecture/Ă©criture sur le repository pour le module monprojet :

$ cvs history ae -m monprojet

Diff : DiffĂ©rence entre un fichier local et sa version du repository

[modifier | modifier le wikicode]

On peut parfois oublier quelles modifications on a apportĂ© Ă  un fichier depuis le dernier commit. Pour connaĂźtre les diffĂ©rences entre sa version locale modifiĂ©e et la version du repository, on peut utiliser la commande suivante :

$ cvs diff fichier.c

Voir les différences entre plusieurs versions d'un fichier

[modifier | modifier le wikicode]
$ cvs diff -r revision1 -r revision2 fichier

Restaurer la version du repository pour un fichier

[modifier | modifier le wikicode]

AprĂšs avoir fait des tests en modifiant un fichier, on peut vouloir annuler ces modifications. Pour revenir Ă  la version du repository, sans prendre en compte les modifications, il faut d'abord effacer le fichier local, puis l'updater :

$ rm fichier.c
$ cvs update fichier.c

Import : IntĂ©grer un projet dans CVS

[modifier | modifier le wikicode]
  1. Nettoyer les fichiers temporaires.
  2. Bien identifier les parties qui sont communes à plusieurs projets pour définir les modules. Dans le cas d'un projet de petite taille, tout peut aller dans un seul module.
  3. Pour chaque module :
    1. Se mettre dans le rĂ©pertoire oĂč sont les sources et rĂ©pertoires.
    2. Taper : “cvs import <nom-module> d1 d2”. d1 et d2 sont des textes bidons, utiles seulement dans des cas particuliers.
    3. Remonter d'un rĂ©pertoire, et renommer le rĂ©pertoire dans lequel on Ă©tait avec un nom qui fasse comprendre qu'on ne doit plus y toucher (exemple: monprojet.original). Éventuellement le mettre en lecture seule.
  4. Créer d'éventuels alias de modules.
  5. Et voilà. Pour commencer à travailler, il ne reste plus aux développeurs qu'à faire un checkout.

Aller voir ce qui se trouve dans le repository

[modifier | modifier le wikicode]

Il est possible d'aller consulter directement le repository, mais les fichiers y sont stockĂ©s dans un format spĂ©cifique. Le plus simple et le plus confortable est de naviguer en utilisant par exemple le logiciel CvsWeb. Attention : On pourrait parfois ĂȘtre tentĂ© de modifier directement le repository global. Il n'y a jamais besoin de le faire ! Ce serait un moyen trĂšs facile de perdre tout l'historique, ce qui aurait notamment pour consĂ©quence l'impossibilitĂ© de faire des corrections dans les versions releasĂ©es.

Tag : Marquer des versions de fichiers

[modifier | modifier le wikicode]

Il est parfois utile de marquer une version particuliĂšre d'un ou plusieurs fichiers, par exemple pour marquer le pĂ©rimĂštre d'une amĂ©lioration. Par exemple, si je viens d'amĂ©liorer fichier1.c et fichier2.c pour corriger le bug BUG_6845, il peut ĂȘtre judicieux de taper la commande : cvs tag BUG_6845 fichier1.c fichier2.c S’il s'agit de tagger toute une arborescence, utiliser dans la commande : cvs rtag BUG_6845 monprojet

Tag -b : CrĂ©er une branche

[modifier | modifier le wikicode]

CrĂ©er une branche MONPROJET_7_1_1_1 permet, plus tard, de rĂ©cupĂ©rer cette version livrĂ©e en faisant un checkout avec l'option “-r”. Rien n'est dupliquĂ© dans le repository, cette commande ajoute simplement un tag Ă  tous les fichiers dans l'Ă©tat oĂč ils sont. Il faut d'abord se mettre dans son rĂ©pertoire de dĂ©veloppement, faire un cvs update pour vĂ©rifier que tout est Ă  jour :

$ cvs update

VĂ©rifier une derniĂšre fois que tout est ok, packager le logiciel, faire la sortie officielle de cette version, puis tagger avec l'option -b :

$ cvs tag MONPROJET_7_1_1_1-trunk
$ cvs tag -b MONPROJET_7_1_1_1

Ensuite, les dĂ©veloppeurs qui le souhaitent pourront travailler sĂ©parĂ©ment sur le tronc commun, ou sur la branche. Cette commande crĂ©e deux espaces de travail, un pour la version de dĂ©veloppement et un pour la version livrĂ©e 7.1.1.1 :

$ cvs checkout monprojet
$ mv monprojet monprojet_dev
$ cvs checkout -r MONPROJET_7_1_1_1 monprojet
$ mv monprojet monprojet_7111

Le tag MONPROJET_7_1_1_1-trunk n'est gĂ©nĂ©ralement pas utile, mais on peut en avoir besoin dans la situation bien particuliĂšre oĂč on voudrait rĂ©cupĂ©rer l'image du tronc commun tel qu'il Ă©tait au moment de la crĂ©ation de la branche.

Reporter les améliorations d'une branche vers le tronc

[modifier | modifier le wikicode]

Tout d'abord, se mettre dans une copie locale de la branche et tagger les fichiers dans lesquels se trouvent les amĂ©liorations (ou tout si c'est justifiĂ©) :

branche$ cvs tag mergeto_trunk_FIX1016 fichiers ...

Convention : J'ai pris l'exemple de FIX1016 mais on peut prendre n'importe quel identifiant qui soit unique au repository entier. Se mettre dans une copie locale du tronc et lancer cette commande :

tronc$ cvs update -j mergeto_trunk_FIX1016

Il y aura probablement de nombreux conflits à résoudre. Une fois que c'est fait, commiter et tagger:

tronc$ cvs commit fichiers ...
tronc$ cvs tag mergefrom_DEL_CAS_7_1_1_1_FIX1016 fichiers ...

MONPROJET_7_1_1_1 est un exemple qui correspond au nom exact de la branche.

Reporter les améliorations du tronc vers une branche

[modifier | modifier le wikicode]

Tout d'abord, se mettre dans une copie locale du tronc et tagger les fichiers dans lesquels se trouvent les amĂ©liorations (ou tout si c'est justifiĂ©) :

tronc$ cvs tag mergeto_MONPROJET_7_1_1_1_AMELIORATION756 fichiers ...

Se mettre dans une copie locale de la branche et lancer cette commande :

branche$ cvs update -j mergeto_DEL_CAS_7_1_1_1_AMELIORATION756

Il y aura probablement de nombreux conflits Ă  rĂ©soudre. Une fois que c'est fait, commiter et tagger :

branche$ cvs commit fichiers ...
branche$ cvs tag mergefrom_trunk_AMELIORATION1016 fichiers ...

Liens externes

[modifier | modifier le wikicode]