SVNBOOK AppB Subversion for CVS Users

De Framalang Wiki.

Cette page fait partie du projet Version control with subversion.

Pseudo Code Rôle Statut
Hotshot92 Traduction Fait
SVF 1ère Relecture Fait
Validation

Source : http://svnbook.red-bean.com/en/1.5/svn-book.html#svn.forcvs


Sommaire

Subversion for CVS Users

Subversion for CVS Users
Guide Subversion à l'usage des utilisateurs de CVS

This appendix is a guide for CVS users new to Subversion. It's essentially a list of differences between the two systems as “viewed from 10,000 feet.” For each section, we provide references to relevant chapters when possible.

Although the goal of Subversion is to take over the current and future CVS user base, some new features and design changes were required to fix certain “broken” behaviors that CVS had. This means that, as a CVS user, you may need to break habits—ones that you forgot were odd to begin with.

Cet appendice est un guide pour les utilisateurs de CVS qui découvrent Subversion. Il est essentiellement constitué d'une liste de différences, au doigt mouillé, entre les deux systèmes. Pour chaque section, nous fournissons autant que possible les références des chapitres pertinents.

Bien que le but de Subversion soit de s'emparer de la communauté des utilisateurs actuels et futurs de CVS, de nouvelles fonctionnalités et des changements conceptuels étaient nécessaires pour corriger certains comportements "malencontreux" de CVS. Cela signifie que, en tant qu'utilisateur de CVS, vous devrez vous défaire de certaines habitudes - celles dont vous avez oublié combien elles vous semblaient bizarres au début.

Revision Numbers Are Different Now

Revision Numbers Are Different Now
Les numéros de révisions sont différents

In CVS, revision numbers are per file. This is because CVS stores its data in RCS files; each file has a corresponding RCS file in the repository, and the repository is roughly laid out according to the structure of your project tree.

In Subversion, the repository looks like a single filesystem. Each commit results in an entirely new filesystem tree; in essence, the repository is an array of trees. Each of these trees is labeled with a single revision number. When someone talks about “revision 54”, he's talking about a particular tree (and indirectly, the way the filesystem looked after the 54th commit).

Technically, it's not valid to talk about “revision 5 of foo.c.” Instead, one would say “foo.c as it appears in revision 5.” Also, be careful when making assumptions about the evolution of a file. In CVS, revisions 5 and 6 of foo.c are always different. In Subversion, it's most likely that foo.c did not change between revisions 5 and 6.

Similarly, in CVS, a tag or branch is an annotation on the file or on the version information for that individual file, whereas in Subversion, a tag or branch is a copy of an entire tree (by convention, into the /branches or /tags directories that appear at the top level of the repository, beside /trunk). In the repository as a whole, many versions of each file may be visible: the latest version on each branch, every tagged version, and of course the latest version on the trunk itself. So, to refine the terms even further, one would often say “foo.c as it appears in /branches/REL1 in revision 5.”

For more details on this topic, see the section called “Revisions”.

Dans CVS, les numéros de révisions sont associés à un fichier. Ceci est du au fait que CVS stocke ses données dans des fichiers RCS ; à chaque fichier est associé un fichier RCS dans le dépôt et la structure du dépôt correspond plus ou moins à l'arborescence de votre projet.

Dans Subversion, le dépôt ressemble à un système de fichiers unique. Chaque propagation conduit à un système de fichiers entièrement nouveau ; au fond, le dépôt est un tableau d'arborescences de fichiers. Chacune de ces arborescence est étiquetée avec un numéro de révision. Quand quelqu'un parle de la "révision 54", il parle d'une arborescence particulière (et indirectement, de l'état du système de fichiers après la cinquante-quatrième propagation).

Techniquement, il n'est pas correct de parler de "la révision 5 de machin.c". À la place, on devrait dire "machin.c tel qu'il était en révision 5". Soyez également prudent quand vous faites des suppositions sur les évolutions d'un fichier. Dans CVS, les révisions 5 et 6 de machin.c sont toujours différentes. Dans Subversion, le plus probable est que machin.c n'a pas changé entre les révisions 5 et 6.

De la même manière, dans CVS, une étiquette et une branche sont des annotations sur un fichier ou sur l'information de version de ce fichier. En revanche, dans Subversion, une étiquette et une branche sont des copies complètes d'une arborescence (situées par convention dans les répertoires /branches ou /tags qui se trouvent à la racine de l'arborescence du dépôt, à côté de /trunk). Dans l'ensemble du dépôt, plusieurs versions de chaque fichier peuvent être visibles : la dernière version à l'intérieur de chaque branche, la version au sein de chaque étiquette et, bien sûr, la dernière version dans le tronc lui-même (sous /trunk). Ainsi, pour être vraiment précis, il convient de dire "machin.c tel qu'il était dans /branches/LIVRAISON1 en révision 5".

Pour plus de détails sur ce sujet, consultez la section intitulée "Révisions".

Directory Versions

Directory Versions
Suivi de versions des répertoires

Subversion tracks tree structures, not just file contents. It's one of the biggest reasons Subversion was written to replace CVS.

Here's what this means to you, as a former CVS user:

  • The svn add and svn delete commands work on directories now, just as they work on files. So do svn copy and svn move. However, these commands do not cause any kind of immediate change in the repository. Instead, the working items are simply “scheduled” for addition or deletion. No repository changes happen until you run svn commit.
  • Directories aren't dumb containers anymore; they have revision numbers like files. (Or more properly, it's correct to talk about “directory foo/ in revision 5.”)

Subversion assure le suivi de l'arborescence entière, pas seulement des fichiers. C'est une des raisons majeures pour lesquelles Subversion a été créé, dans le but de se substituer à CVS.

Voilà ce que cela implique, du point de vue d'un ancien utilisateur de CVS :

  • Les commandes svn add et svn delete fonctionnent désormais aussi sur les répertoires, de la même manière que sur les fichiers. Idem pour svn copy et svn move. Cependant, ces commandes n'ont pas d'effet immédiat sur le dépôt ; en effet, elles ne font que planifier l'ajout ou la suppression des éléments concernés. Aucun changement n'a lieu dans le dépôt tant que vous n'avez pas effectué de propagation.
  • Les répertoires ne sont plus de simples conteneurs ; ils possèdent un numéro de révision tout comme les fichiers (ou pour être plus précis, il faut parler du "répertoire machin/ tel qu'il était en révision 5").

Let's talk more about that last point. Directory versioning is a hard problem; because we want to allow mixed-revision working copies, there are some limitations on how far we can abuse this model.

From a theoretical point of view, we define “revision 5 of directory foo” to mean a specific collection of directory entries and properties. Now suppose we start adding and removing files from foo, and then commit. It would be a lie to say that we still have revision 5 of foo. However, if we bumped foo's revision number after the commit, that would be a lie too; there may be other changes to foo we haven't yet received, because we haven't updated yet.

Subversion deals with this problem by quietly tracking committed adds and deletes in the .svn area. When you eventually run svn update, all accounts are settled with the repository, and the directory's new revision number is set correctly. Therefore, only after an update is it truly safe to say that you have a “perfect” revision of a directory. Most of the time, your working copy will contain “imperfect” directory revisions.

Similarly, a problem arises if you attempt to commit property changes on a directory. Normally, the commit would bump the working directory's local revision number. But again, that would be a lie, as there may be adds or deletes that the directory doesn't yet have, because no update has happened. Therefore, you are not allowed to commit property changes on a directory unless the directory is up to date.

For more discussion about the limitations of directory versioning, see the section called “Mixed Revision Working Copies”.

Approfondissons ce dernier point. Le suivi en versions d'un répertoire est un problème difficile ; comme nous voulons autoriser des copies de travail à cheval sur plusieurs révisions, des limitations apparaissent quand on essaie de pousser le modèle trop loin.

D'un point de vue théorique, nous définissons "la révision 5 du répertoire machin" comme un ensemble d'entrées et de propriétés du répertoire. Maintenant, supposons que nous ajoutions et supprimions des fichiers de machin, puis que nous propagions ces modifications. Dire que nous avons toujours la révision 5 de machin serait un mensonge. Cependant, si nous changions le numéro de révision de machin après la propagation, ce serait aussi un mensonge ; il pourrait y avoir d'autres changements sur machin que nous n'avons pas encore reçus parce que nous n'avons pas encore effectué de mise à jour.

Subversion traite ce problème en conservant discrètement, dans la zone .svn, le détail des ajouts et des suppressions propagés. Par la suite, quand vous lancez svn update, ces informations sont prises en compte et combinées avec celles du dépôt, et le nouveau numéro de révision du répertoire est alors positionné correctement. Ainsi, c'est seulement après une mise à jour que vous pourrez affirmer, sans risque de vous tromper, que vous disposez d'une révision "parfaite" d'un répertoire. La plupart du temps, votre copie de travail contient des répertoires "imparfaitement" synchronisés.

De la même manière, un problème survient si vous essayez de propager des modifications de propriétés sur un répertoire. Normalement, la propagation devrait ajuster le numéro de révision du répertoire de la copie de travail locale. Mais là encore, ce serait un mensonge puisqu'il peut y avoir des ajouts et des suppressions que le répertoire n'a pas encore reçu en raison de la mise à jour qui n'a pas encore eu lieu. En conséquence, il n'est pas permis de propager des changements sur les propriétés d'un répertoire sans que ce répertoire ne soit préalablement mis à jour.

Pour plus d'informations sur les limitations du suivi en versions des répertoires, reportez-vous à la section intitulée "Copies de travail mixtes, à révisions mélangées".

More Disconnected Operations

More Disconnected Operations
Plus d'opérations en mode déconnecté

In recent years, disk space has become outrageously cheap and abundant, but network bandwidth has not. Therefore, the Subversion working copy has been optimized around the scarcer resource.

The .svn administrative directory serves the same purpose as the CVS directory, except that it also stores read-only, “pristine” copies of your files. This allows you to do many things offline:

svn status

Shows you any local changes you've made (see the section called “See an overview of your changes”)

svn diff

Shows you the details of your changes (see the section called “Examine the details of your local modifications”)

svn revert

Removes your local changes (see the section called “Undoing Working Changes”)

Also, the cached pristine files allow the Subversion client to send differences when committing, which CVS cannot do.

The last subcommand in the list—svn revert—is new. It will not only remove local changes, but also unschedule operations such as adds and deletes. Although deleting the file and then running svn update will still work, doing so distorts the true purpose of updating. And, while we're on this subject…

Ces dernières années, l'espace de stockage sur disques est devenu outrageusement bon marché et abondant, alors que ce n'est pas le cas pour la bande passante disponible sur le réseau. En conséquence, les copies de travail Subversion ont été optimisées pour économiser la ressource la plus rare.

Le répertoire administratif .svn a le même objectif que le répertoire CVS, à la différence près qu'il stocke également des copies "originales" en lecture seule de vos fichiers. Ceci permet beaucoup d'opérations sans connexion réseau :

svn status

liste les modifications locales que vous avez apportées (voir la section intitulée "Avoir une vue globale des changements effectués") ;

svn diff

donne le détail de vos modifications (voir la section intitulée "Voir en détail les modifications que vous avez effectuées") ;

svn revert

supprime vos modifications locales (voir la section intitulée "Annuler des changements sur la copie de travail").

Par ailleurs, les fichiers originaux en cache permettent au client Subversion de n'envoyer que les différences au moment de la propagation, ce que CVS ne peut pas faire.

La dernière sous-commande de la liste (svn revert) est nouvelle. Elle supprime non seulement les modifications locales mais aussi annule les opérations planifiées telles que les ajouts et les suppressions. Bien que supprimer le fichier puis lancer svn update fonctionne toujours, cette méthode détourne la mise à jour de sa vocation. Et puis, tant que nous y sommes...

Distinction Between Status and Update

Distinction Between Status and Update
Distinction entre les commandes status et update

Subversion attempts to erase a lot of the confusion between the cvs status and cvs update commands.

The cvs status command has two purposes: first, to show the user any local modifications in the working copy, and second, to show the user which files are out of date. Unfortunately, because of CVS's hard-to-read status output, many CVS users don't take advantage of this command at all. Instead, they've developed a habit of running cvs update or cvs -n update to quickly see their changes. If users forget to use the -n option, this has the side effect of merging repository changes they may not be ready to deal with.

Subversion removes this muddle by making the output of svn status easy to read for both humans and parsers. Also, svn update prints only information about files that are updated, not local modifications.

Subversion essaie de dissiper la confusion qui règne entre les commandes cvs status et cvs update.

La commande cvs status a deux objectifs : d'abord, lister pour l'utilisateur les modifications locales de la version de travail et, ensuite, indiquer à l'utilisateur quels fichiers ne sont plus à jour. Malheureusement, en raison de l'affichage peu lisible de la commande cvs status, beaucoup d'utilisateurs de CVS n'utilisent plus cette commande. À la place, ils ont pris l'habitude de lancer cvs update ou cvs -n update pour visualiser leurs changements rapidement. Si les utilisateurs oublient d'utiliser l'option -n, cela a pour effet de bord de fusionner des changements du dépôt qu'ils ne sont pas forcément prêts à prendre en compte.

Subversion supprime ce cafouillage en facilitant la lecture de svn status à la fois pour les humains et pour les analyseurs de texte. De plus, svn update n'affiche que les informations relatives aux fichiers qui ont été mis à jour côté dépôt, pas les modifications locales.

Status

Status
svn status

svn status prints all files that have local modifications. By default, the repository is not contacted. While this subcommand accepts a fair number of options, the following are the most commonly used ones:

-u 
Contact the repository to determine, and then display, out-of-dateness information.
-v 
Show all entries under version control.
-N 
Run nonrecursively (do not descend into subdirectories).

The svn status command has two output formats. In the default “short” format, local modifications look like this:

La commande svn status liste tous les fichiers qui ont des modifications locales. Par défaut, le dépôt n'est pas contacté. Bien que cette sous-commande accepte un bon nombre d'options, voici les plus utilisées :

-u 
contacte le dépôt pour déterminer et lister les informations de mise à jour ;
-v 
liste tous les éléments soumis au suivi de versions ;
-N 
exécution non récursive (ne pas descendre dans les sous-répertoires).

La commande svn status possède deux formats de sortie. Dans le mode "court", mode par défaut, les modifications locales sont présentées comme ceci :

$ svn status
M      foo.c
M      bar/baz.c
$ svn status
M      machin.c
M      truc/bidule.c

If you specify the --show-updates (-u) option, a longer output format is used:

Si vous spécifiez l'option --show-updates (-u), un format d'affichage plus long sera utilisé :
$ svn status -u
M            1047   foo.c
       *     1045   faces.html
       *            bloo.png
M            1050   bar/baz.c
Status against revision:   1066
$ svn status -u
M            1047   machin.c
       *     1045   tetes.html
       *            dessin.png
M            1050   truc/bidule.c
État par rapport à la révision  1066

In this case, two new columns appear. The second column contains an asterisk if the file or directory is out of date. The third column shows the working copy's revision number of the item. In the previous example, the asterisk indicates that faces.html would be patched if we updated, and that bloo.png is a newly added file in the repository. (The absence of any revision number next to bloo.png means that it doesn't yet exist in the working copy.)

At this point, you should take a quick look at the list of all possible status codes in svn status. Here are a few of the more common status codes you'll see:

Dans ce cas, deux nouvelles colonnes font leur apparition. La deuxième colonne contient une astérisque si le fichier ou le répertoire n'est plus à jour. La troisième colonne contient le numéro de révision de la copie de travail pour l'élément considéré. Dans l'exemple précédent, l'astérisque indique que tetes.html serait modifié lors d'une mise à jour et que dessin.png est un nouveau fichier dans le dépôt (l'absence d'un numéro de révision pour dessin.png indique qu'il n'existe pas dans la copie de travail locale).

Vous devriez maintenant jeter un oeil à la liste des codes d'état possibles de svn status. Voici quelques codes d'état courants que vous rencontrerez :
A    Resource is scheduled for Addition
D    Resource is scheduled for Deletion
M    Resource has local Modifications
C    Resource has Conflicts (changes have not been completely merged
       between the repository and working copy version)
X    Resource is eXternal to this working copy (may come from another
       repository).  See the section called “Externals Definitions”
?    Resource is not under version control
!    Resource is missing or incomplete (removed by a tool other than
       Subversion)
A    L'Ajout de l'élément est planifié
D    La suppression de l'élément est planifiée
M    L'élément a été Modifié localement
C    L'élément est en Conflit (les changements n'ont pas été complètement
       fusionnés entre la version du dépôt et la version de la copie de travail)
X    L'élément est eXterne à cette copie de travail (il vient peut-être 
       d'un autre dépôt). Voir la section intitulée “Définitions externes”
?    L'élément n'est pas suivi en versions 
!    L'élément est manquant ou incomplet (supprimé par un moyen autre que 
       Subversion)

For a more detailed discussion of svn status, see the section called “See an overview of your changes”.

Pour plus de détails sur la commande svn status, consultez la section intitulée "Avoir une vision globale des changements effectués".

Update

Update
svn update

svn update updates your working copy, and prints only information about files that it updates.

Subversion has combined CVS's P and U codes into just U. When a merge or conflict occurs, Subversion simply prints G or C, rather than a whole sentence about it.

For a more detailed discussion of svn update, see the section called “Update Your Working Copy”.

La commande svn update met à jour votre copie de travail et n'affiche que les informations relatives aux fichiers qui ont été mis à jour.

Subversion combine les codes CVS P et U dans le seul code U. Quand une fusion ou un conflit apparaît, Subversion se contente d'afficher G ou C, plutôt qu'une phrase complète, pour indiquer le problème.

Pour plus d'informations sur svn update, reportez-vous à la section intitulée "Mettre à jour votre copie de travail".

Branches and Tags

Branches and Tags
Branches et étiquettes

Subversion doesn't distinguish between filesystem space and “branch” space; branches and tags are ordinary directories within the filesystem. This is probably the single biggest mental hurdle that a CVS user will need to cross. Read all about it in Chapter 4, Branching and Merging.

Subversion ne fait pas de différence entre l'espace du système de fichiers et l'espace des branches ; les branches et les étiquettes sont de simples répertoires du système de fichiers. C'est probablement l'obstacle psychologique le plus important que les utilisateurs de CVS auront à franchir. Pour tout savoir sur ce sujet, rendez-vous au chapitre 4, "Branches et étiquettes".

WARNING

Since Subversion treats branches and tags as ordinary directories, your project's various lines of development probably live in subdirectories of the main project directory. So remember to check out using the URL of the subdirectory that contains the particular line of development you want, not the project's root URL. If you make the mistake of checking out the root of the project, you may very well wind up with a working copy that contains a complete copy of your project's content for each and every one of its branches and tags. [60]
Puisque Subversion traite les branches et les étiquettes comme de simples répertoires, les différentes lignes de développement de votre projet sont probablement hébergées dans des sous-répertoires du répertoire du projet principal. En conséquence, n'oubliez pas de faire vos extractions en spécifiant l'URL du sous-répertoire qui contient la ligne de développement que vous désirez et pas l'URL racine du projet. Sinon, il y a de grandes chances pour que vous récupériez une copie complète de votre projet, y compris toutes les branches et toutes les étiquettes [60].

Metadata Properties

Metadata Properties
Propriétés des méta-données

A new feature of Subversion is that you can attach arbitrary metadata (or “properties”) to files and directories. Properties are arbitrary name/value pairs associated with files and directories in your working copy.

To set or get a property name, use the svn propset and svn propget subcommands. To list all properties on an object, use svn proplist.

For more information, see the section called “Properties”.

Une nouvelle fonctionnalité de Subversion est la possibilité d'affecter des méta-données arbitraires (ou "propriétés") aux fichiers et répertoires. Les propriétés sont des couples nom/valeur arbitraires associés aux fichiers et répertoires de votre copie de travail locale.

Pour définir ou récupérer un nom de propriété, utilisez les sous-commandes svn propset et svn propget. Pour obtenir la liste de toutes les propriétés d'un objet, utilisez svn proplist.

Pour plus d'informations, reportez-vous à la section intitulée "Propriétés".

Conflict Resolution

Conflict Resolution
Résolution des conflits

CVS marks conflicts with inline “conflict markers,” and then prints a C during an update or merge operation. Historically, this has caused problems, because CVS isn't doing enough. Many users forget about (or don't see) the C after it whizzes by on their terminal. They often forget that the conflict markers are even present, and then accidentally commit files containing those conflict markers.

Subversion solves this problem in a pair of ways. First, when a conflict occurs in a file, Subversion records the fact that the file is in a state of conflict, and won't allow you to commit changes to that file until you explicitly resolve the conflict. Second, Subversion 1.5 provides interactive conflict resolution, which allows you to resolve conflicts as they happen instead of having to go back and do so after the update or merge operation completes. See the section called “Resolve Conflicts (Merging Others' Changes)” for more about conflict resolution in Subversion.

CVS signale les conflits par des "marqueurs de conflits" insérés directement dans les fichiers puis affiche un C pendant l'opération de mise à jour ou de fusion. Historiquement, ce comportement a généré beaucoup de problèmes, car CVS ne finit pas son travail. Beaucoup d'utilisateurs oublient (ou ne voient pas) le C une fois qu'il disparaît de l'écran. Ils oublient aussi souvent que les marqueurs de conflit sont toujours présents et, accidentellement, propagent des fichiers contenant ces marqueurs de conflit.

Subversion corrige ce problème de deux façons. D'abord, quand un conflit est détecté sur un fichier, Subversion enregistre le fait que le fichier est en conflit et refusera pas de propager des modifications concernant ce fichier tant que vous ne résolvez pas explicitement le conflit. Ensuite, Subversion 1.5 propose une résolution interactive des conflits, ce qui vous permet de résoudre les conflits au moment où ils apparaissent plutôt que d'avoir à revenir dessus une fois que la fusion ou la mise à jour est terminée. Consultez la section intitulée "Résoudre les conflits (Fusionner des modifications)" pour plus d'informations sur la résolution des conflits avec Subversion.

Binary Files and Translation

Binary Files and Translation
Fichiers binaires et conversions

In the most general sense, Subversion handles binary files more gracefully than CVS does. Because CVS uses RCS, it can only store successive full copies of a changing binary file. Subversion, however, expresses differences between files using a binary differencing algorithm, regardless of whether they contain textual or binary data. That means all files are stored differentially (compressed) in the repository.

CVS users have to mark binary files with -kb flags to prevent data from being garbled (due to keyword expansion and line-ending translations). They sometimes forget to do this.

Subversion takes the more paranoid route. First, it never performs any kind of keyword or line-ending translation unless you explicitly ask it to do so (see the section called “Keyword Substitution” and the section called “End-of-Line Character Sequences” for more details). By default, Subversion treats all file data as literal byte strings, and files are always stored in the repository in an untranslated state.

Second, Subversion maintains an internal notion of whether a file is “text” or “binary” data, but this notion is only extant in the working copy. During an svn update, Subversion will perform contextual merges on locally modified text files, but will not attempt to do so for binary files.

To determine whether a contextual merge is possible, Subversion examines the svn:mime-type property. If the file has no svn:mime-type property, or has a MIME type that is textual (e.g., text/*), Subversion assumes it is text. Otherwise, Subversion assumes the file is binary. Subversion also helps users by running a binary-detection algorithm in the svn import and svn add commands. These commands will make a good guess and then (possibly) set a binary svn:mime-type property on the file being added. (If Subversion guesses wrong, the user can always remove or hand-edit the property.)

En général, Subversion se débrouille mieux avec les fichiers binaires que CVS. Comme CVS utilise RCS, il est seulement capable de stocker successivement des copies entières d'un fichier binaire modifié. Subversion, en revanche, utilise un algorithme de différenciation binaire, indépendant du contenu textuel ou binaire des fichiers, pour déterminer les différences entre les fichiers. Cela veut dire que tous les fichiers sont stockés de manière différentielle (compressée) dans le dépôt.

Les utilisateurs de CVS doivent marquer les fichiers binaires avec l'indicateur -kb pour empêcher que les données ne soient corrompues (par l'expansion des mots-clés et les conversions de fins de lignes). Ils oublient quelquefois de le faire.

Subversion utilise une approche plus paranoïaque. Premièrement, il ne fait aucune substitution de mot-clé ou de fin de ligne à moins qu'on ne le lui demande explicitement (voir les sections intitulées "Substitution de mots-clés" et "Caractères de fin de ligne" pour plus de détails). Par défaut, Subversion considère que les fichiers de données sont des suites littérales d'octets et les fichiers sont toujours stockés dans le dépôt dans un état "non-converti".

Deuxièmement, Subversion conserve une notion interne pour le contenu de chaque fichier : "texte" ou "binaire". Mais cette notion ne s'applique qu'à la copie de travail locale. Lors d'un svn update, Subversion effectuera des fusions contextuelles sur les fichiers texte modifiés localement mais ne tentera pas d'en faire autant pour les fichiers binaires.

Pour déterminer si une fusion contextuelle est possible, Subversion examine la propriété svn:mime-type. Si le fichier ne possède pas la propriété svn:mime-type ou si le type MIME est textuel (par exemple text/*), Subversion considère que c'est du texte. Sinon, Subversion considère que le fichier est binaire. Subversion aide également les utilisateurs en incluant l'exécution d'un algorithme de détection des fichiers binaires dans les commandes svn import et svn add. Ces commandes tentent de deviner puis affectent (éventuellement) un type binaire à la propriété svn:mime-type du fichier ajouté (si Subversion se trompe dans la détection, l'utilisateur peut toujours supprimer ou éditer à la main la propriété).

Versioned Modules

Versioned Modules
Suivi en versions des modules

Unlike CVS, a Subversion working copy is aware that it has checked out a module. That means if somebody changes the definition of a module (e.g., adds or removes components), a call to svn update will update the working copy appropriately, adding and removing components.

Subversion defines modules as a list of directories within a directory property; see the section called “Externals Definitions”.

Contrairement à CVS, une copie de travail locale de Subversion sait qu'elle est l'extraction d'un module. Cela signifie que si quelqu'un change la définition du module (par exemple ajoute ou supprime des composants), un appel à svn update mettra à jour la copie de travail correctement, en ajoutant et supprimant les composants concernés.

Subversion définit les modules comme une liste de répertoires formant une propriété d'un répertoire ; voir la section intitulée "Définitions externes".

Authentication

Authentication
Authentification

With CVS's pserver, you are required to log in to the server (using the cvs login command) before performing any read or write operation—you sometimes even have to log in for anonymous operations. With a Subversion repository using Apache httpd or svnserve as the server, you don't provide any authentication credentials at the outset—if an operation that you perform requires authentication, the server will challenge you for your credentials (whether those credentials are username and password, a client certificate, or even both). So if your repository is world-readable, you will not be required to authenticate at all for read operations.

As with CVS, Subversion still caches your credentials on disk (in your ~/.subversion/auth/ directory) unless you tell it not to by using the --no-auth-cache option.

The exception to this behavior, however, is in the case of accessing an svnserve server over an SSH tunnel, using the svn+ssh:// URL scheme. In that case, the ssh program unconditionally demands authentication just to start the tunnel.

Avec le pserver de CVS, vous devez vous connecter au serveur (en utilisant la commande cvs login) avant n'importe quelle opération de lecture ou d'écriture — parfois, vous devez même vous authentifier pour des opérations en mode anonyme. Avec un dépôt Subversion utilisant Apache httpd ou svnserve, vous n'avez pas besoin de vous authentifier a priori — si une opération nécessite que vous vous authentifiez, le serveur vous demandera de le faire (que ce soit par identifiant et mot de passe, certificat client ou les deux). Ainsi, si votre dépôt est accessible en lecture pour tous, vous n'aurez pas besoin de vous authentifier pour les opérations de lecture.

Comme CVS, Subversion met en cache sur le disque vos éléments d'authentification (dans votre répertoire ~/.subversion/auth) à moins que vous ne lui spécifiez le contraire avec l'option --no-auth-cache.

Ce comportement possède une exception : l'accès à un serveur svnserve via un tunnel SSH, en utilisant les URL de type svn+ssh://. Dans ce cas, le programme ssh vous demandera toujours de vous authentifier avant d'ouvrir le tunnel.

Converting a Repository from CVS to Subversion

Converting a Repository from CVS to Subversion
Convertir un dépôt CVS vers Subversion

Perhaps the most important way to familiarize CVS users with Subversion is to let them continue to work on their projects using the new system. And while that can be somewhat accomplished using a flat import into a Subversion repository of an exported CVS repository, the more thorough solution involves transferring not just the latest snapshot of their data, but all the history behind it as well, from one system to another. This is an extremely difficult problem to solve; it involves deducing changesets in the absence of atomicity and translating between the systems' completely orthogonal branching policies, among other complications. Still, a handful of tools claim to at least partially support the ability to convert existing CVS repositories into Subversion ones.

The most popular (and mature) conversion tool is cvs2svn (http://cvs2svn.tigris.org/), a Python program originally created by members of Subversion's own development community. This tool is meant to run exactly once: it scans your CVS repository multiple times and attempts to deduce commits, branches, and tags as best it can. When it finishes, the result is either a Subversion repository or a portable Subversion dump file representing your code's history. See the web site for detailed instructions and caveats.

La meilleure façon d'habituer les utilisateurs CVS à Subversion est certainement de les laisser continuer à travailler sur leurs projets en utilisant le nouveau système. Et, bien que cela puisse être fait par un import "à plat" dans le dépôt Subversion d'un dépôt CVS exporté, la solution la plus aboutie implique de transférer d'un système à l'autre non seulement le dernière version des données mais aussi tout l'historique qui va avec. C'est un problème particulièrement ardu ; cela implique, parmi d'autres complications, de déterminer les modifications qui vont ensemble, en l'absence d'atomicité et de mécanisme de conversion entre les politiques totalement contradictoires de gestion des branches des deux systèmes. Néanmoins, il existe quelques outils qui se prétendent capables de convertir, au moins en partie, des dépôts CVS en dépôts Subversion.

L'outil le plus populaire (et le plus abouti) est cvs2svn (http://cvs2svn.tigris.org/, site en anglais), un programme en Python créé à l'origine par des membres de la communauté de développement Subversion elle-même. Cet outil n'est censé être lancé qu'une seule fois : il analyse votre dépôt CVS plusieurs fois et essaie d'en déduire des propagations, des branches et des étiquettes autant qu'il le peut. Au final, le résultat est soit un dépôt Subversion soit un fichier dump Subversion représentant l'historique du code. Consultez le site web pour les le détail des instructions et les précautions d'usage.

NOTES DE FIN DE CHAPITRE

[60] That is, providing you don't run out of disk space before your checkout finishes.

[60] c'est-à-dire : si vous avez suffisamment d'espace disque pour pouvoir terminer l'extraction.