Un outil pour le développement collaboratif
20 Septembre 2006
Je ne parlerai que de l'utilisation du côté client.
Plutôt qu'une présentation de Subversion, il s'agit de quelques remarques d'utilisation essentiellement basée sur notre expérience.
Et pas davantage ...
un des principaux outils de travail collaboratif
C'est la réimplémentation complète de CVS, suivant le même modèle éprouvé, mais corrigeant l'essentiel de ces défauts
Explicitement développé comme le successeur de
CVS
Si on remplace dans la commande cvs par svn, un utilisateur de CVS sera opérationnel très rapidement.
$> svn help
usage: svn <subcommand> [options] [args] Subversion command-line client, version 1.4.0. Type 'svn help <subcommand>' for help on a specific subcommand. Type 'svn --version' to see the program version and RA modules or 'svn --version --quiet' to see just the version number. Most subcommands take file and/or directory arguments, recursing on the directories. If no arguments are supplied to such a command, it recurses on the current directory (inclusive) by default. ...
$> svn help merge
merge: Applique les différences entre deux sources à une copie de travail. usage : 1. merge URL1[@N] URL2[@M] [CHEMIN] 2. merge CHEMIN1@N CHEMIN2@M [CHEMIN] 3. merge [-c M|-r N:M] SOURCE[@REV] [CHEMIN] 1. Les URLs des deux références sont précisées. Les révisions peuvent aussi être précisées, si elles ne le sont pas, la révision utilisée est HEAD. 2. Les URLs sont déduites des chemins dans la copie de travail. Les révisions doivent être précisées. ...
Sous Svn, contrairement à CVS, la commande status indique clairement ce qui a été modifié localement, et sans avoir besoin d'être connecté.
$> svn status D BoardDao.php A FebDao.php M FebView.php
Et pour savoir si la copie locale est à jour :
$> svn status --show-updates D 182 BoardDao.php * 182 FebController.php A + 182 FebDao.php M 182 FebView.php Status against revision: 185
La structuration du dépôt, son organisation est libre et peut s'adapter complètement à son modèle de développement, qui peut évoluer.
À tout moment, il est possible de changer l'organisation, de déplacer, renommer, supprimer répertoires ou fichiers simplement et sans perdre l'historique.
$> svn mv oldName.cxx newName.cxx A newName.cxx D oldName.cxx
$> svn mv http://svn.lal.in2p3.fr/FEB/trunc/lib/oldName.cxx \ http://svn.lal.in2p3.fr/FEB/trunc/lib/newName.cxx \ -m "Renommage selon la nouvelle convention"
Les noms définissant les répertoires de Tags et de Branches sont purement conventionnels.
Un répertoire de Tags ne l'est que parce qu'on décide de plus modifier ce qu'on y met ...
svn mkdir URL/projA/trunk /tags /branches
svn mkdir URL/trunk/projB /projC /tags/projB /tags/projC /branches/projB /branches/projC
Probablement une des plus grandes différences avec CVS
$> svn copy -m "Version V0.8" \ http://svn.lal.in2p3.fr/FEB/trunk \ http://svn.lal.in2p3.fr/FEB/tags/V0.8
$> svn copy -m "Release V0.8.1" \ http://svn.lal.in2p3.fr/FEB/trunk \ http://svn.lal.in2p3.fr/FEB/branches/V0.8.1
La commande log de Svn est beaucoup plus utile que sa version CVS
$> svn log -r475 -v ------------------------------------------------------------------------ r475 | aperus | 2006-06-21 23:25:29 +0200 (Wed, 21 Jun 2006) | 1 line Chemins modifiés : M /FEB/trunc/lib/DataTestStatGraph.php M /FEB/trunc/lib/DataTestView.php M /FEB/trunc/lib/FebView.php M /FEB/trunc/lib/FebWidgets.php M /FEB/trunc/lib/StatView.php M /FEB/trunc/lib/StatWidgets.php Ticket #124 - Diverses corrections et améliorations
$> svn log -rHEAD:1 --limit 5 FebView.php
Si l'on demande un svn log tout de suite après avoir commité des modifications, le dernier message de log ne sera pas visible.
En effet, commiter ne met pas à jour automatiquement ni son espace de travail, ni aucun autres fichiers. Il faut d'abord mettre à jour avec svn update.
$> svn log --xml
produit une sortie en xml qui peut ensuite être utilisée avec la feuille de style XSLT qui va bien ...
<?xml version="1.0"?> <log> <logentry revision="475"> <date>2006-06-21T21:25:29.198907Z</date> <paths> <path action="M">/FEB/trunc/lib/StatWidgets.php</path> ...
On donne à Svn la liste des fichiers à ignorer en définissant la property svn::ignore sur les répertoires souhaités
$> svn propset -R svn:ignore . -F .cvsignore
$> svn propset -R svn:ignore "*.png" .
$> setenv SVN_EDITOR vi $> svn propedit svn:ignore .
$> svn commit -m "Ignoring ignorable files"
Commiter de manière à faciliter le code review :
C'est simple : ne pas hésiter à les utiliser !
Les conflits sont normalement rares dans une équipe dont le partage des tâches est correctement géré.
Il peut cependant être intéressant de bloquer temporairement l'accès à des fichiers binaires, dont le fusionnement est impossible.
svn lock
svn unlock
Simple et efficace :
% svn info
Chemin : . URL : http://127.0.0.1:8800/Svn/FEB/trunk/lib Racine du dépôt : http://127.0.0.1:8800/Svn/FEB UUID du dépôt : 9eb0db8a-82ed-0310-b8d5-a3f12c954f74 Révision : 487 Type de noeud : répertoire Tâche programmée : normale Révision de la dernière modification : 487 Date de la dernière modification: 2006-07-14 09:28:24 +0200 (Fri, 14 Jul 2006)
$> svn switch http://127.0.0.1:8800/Svn/FEB/branches/lib-extend-QuickForm
Chemin : . URL : http://127.0.0.1:8800/Svn/FEB/branches/lib-extend-QuickForm Racine du dépôt : http://127.0.0.1:8800/Svn/FEB UUID du dépôt : 9eb0db8a-82ed-0310-b8d5-a3f12c954f74 Révision : 422 Type de noeud : répertoire Tâche programmée : normale Révision de la dernière modification : 487 Date de la dernière modification: 2006-06-04 19:15:54 +0200 (Sun, 4 Jun 2006)
Questions ?
Retrouver dans la dernière version de son espace de travail un fichier supprimé du dépôt; le plus simple est de faire une copie à partir d'une révision antérieure à la suppression.
Utiliser svn log -v pour trouver la révision qui a supprimé le fichier.
$ svn copy --revision 381 http://svn.lal.in2p3.fr/FEB/trunk/lib/FEBWidgets.php ./FEBWidgets.php