Petit tutoriel de svn/svk

à destination des développeurs de Coq

La documentation concernant Subversion est relativement abondante, et assez bien écrite. Le svnbook est une référence assez complète sur le sujet. Il existe également une fonction d'aide fournie par l'outil svn. Par exemple, pour afficher l'aide de la commande checkout, il suffit de faire:

svn help checkout

La documentation sur l'outil svk, est un peu plus pauvre et souffre de sérieuse lacune. Le wiki est assez brouillon, et le svkbook ne marque pas de manière claire la différence entre svn et svk.

Subversion au quotidien

Les branches et les tags

Subversion a une gestion des tags et des branches qui diffère de celle de CVS. Du point de vue de l'utilisateur, une branche ou un tag se présente sous la forme d'une arborescence au sein du dépôt. Concrètement, à la racine d'un dépôt svn, on trouve 3 sous-répertoires:

Créer une branche avec Subversion se fait simplement en effectuant une copie de l'arborescence de développement:

svn copy svn+ssh://username@scm.gforge.inria.fr/coq/trunk svn+ssh://username@scm.gforge.inria.fr/coq/branches/V8.1-bugfix

Il est possible de spécifier une révision particulière en utilisant l'option -r REV.

Les commandes courantes

svn propose des commandes similaires à celles de cvs. On retrouve ainsi checkout, update, log, diff, status, commit, etc.

Pour plus de renseignments, consulter ce chapitre du svnbook.

  1. Récupérer une copie de travail:
    svn checkout svn+ssh://username@scm.gforge.inria.fr/coq/trunk ~/coq-svn/trunk
  2. Mettre à jour sa copie de travail
    svn update ~/coq-svn/trunk
  3. Valider les modifications:
    svn commit ~/coq-svn/trunk

Utiliser les fonctionnalités de svk

L'intérêt principal d'utiliser SVK est de pouvoir committer des modifications «offline». Ça permet par exemple lors d'un gros développement de commiter ses modifications localement, puis lorsque le développement arrive à maturité de pouvoir le fondre dans le dépôt principal.

Avant toute chose, il est nécessaire de disposer d'un dépôt SVK. Il est donc nécessaire d'exécuter la commande:

svk depotmap --init

Elle a pour résultat de créer un dépôt SVK dans ~/.svk/local. Ce dépôt est référencé par //

Il est possible de créer d'autres dépôts, et de les localiser ailleurs sur le système de fichier. Pour plus de détails, voir ce chapitre dans le svkbook.

Remarque: svk maintient un numéro de version propre au dépôt local. Ainsi, les numéros de révision ne seront pas les mêmes entre le miroir et le dépôt principal. Néanmoins, dans les log, svk indique le numéro de révision correspondant sur le dépôt principal.

Initialisation

  1. Créer un miroir du référentiel svn
    svk mirror svn+ssh://username@scm.gforge.inria.fr/svn/coq //coq-mirror
    svk sync //coq-mirror

    Attention: toute modification commitée sur //coq-mirror est répercutée sur le référentiel principal.

  2. Créer une branche locale:
    svk copy //coq-mirror/trunk //coq-local
  3. Rapatrier une copie de travail:
    svk checkout //coq-local coq-local

On peut maintenant faire des modifications dans coq-local, puis les commiter en faisant svk commit.

Validation des modifications

En cours de développement, il est possible de répercuter les changements faits dans le dépôt principal dans le répertoire de travail. Il suffit de:

  1. synchroniser le miroir avec le référentiel principal en faisant:
    svk sync //coq-mirror
  2. fusionner le miroir dans la branche locale:
    svk smerge -I //coq-mirror //coq-local
  3. mettre à jour le répertoire de travail:
    svk sync //coq-mirror

Lorsque le moment vient de valider les modifications, et de les transférer vers le référentiel principal il suivre les étapes suivantes:

  1. synchroniser le miroir avec le référentiel principal;
  2. fusionner la branche locale avec le miroir:
    svk smerge -I //coq-local //coq-mirror

Détachement du répertoire de travail

À la différence de CVS et Subversion, svk n'ajoute pas de fichier dans le répertoire de travail. Lorsque celui-ci devient inutile, il est alors nécessaire de le signaler à svk par la commande:

svk checkout --detach coq-local