SVNBOOK Chap3 Externals Definitions

De Framalang Wiki.

Cette section fait partie du livre Version control with subversion

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


Sommaire

Externals Definitions

Externals Definitions

Définitions externes

Sometimes it is useful to construct a working copy that is made out of a number of different checkouts. For example, you may want different subdirectories to come from different locations in a repository, or perhaps from different repositories altogether. You could certainly set up such a scenario by hand—using svn checkout to create the sort of nested working copy structure you are trying to achieve. But if this layout is important for everyone who uses your repository, every other user will need to perform the same checkout operations that you did.

Parfois il peut être utile de construire une copie de travail issue de différentes extractions. Par exemple, vous pouvez avoir envie d'avoir différents sous-répertoires provenant de différents endroits du dépôt, ou même carrément de différents dépôts. Vous pourriez arriver un tel enchevêtrement manuellement, en utilisant svn checkout pour créer le genre de structure voulu pour votre copie de travail . Mais si cette configuration est importante pour tous les utilisateurs de votre dépôt, chacun devra effectuer les mêmes opérations d'extraction que vous.

Fortunately, Subversion provides support for externals definitions. An externals definition is a mapping of a local directory to the URL—and ideally a particular revision—of a versioned directory. In Subversion, you declare externals definitions in groups using the svn:externals property. You can create or modify this property using svn propset or svn propedit (see the section called “Manipulating Properties”). It can be set on any versioned directory, and its value is a multi-line table of subdirectories (relative to the versioned directory on which the property is set), optional revision flags, and fully qualified, absolute Subversion repository URLs.

  $ svn propget svn:externals calc
  third-party/sounds             http://sounds.red-bean.com/repos
  third-party/skins              http://skins.red-bean.com/repositories/skinproj
  third-party/skins/toolkit -r21 http://svn.red-bean.com/repos/skin-maker

Heureusement, Subversion supporte les définitions externes. Une définition externe est une association entre un répertoire local et une URL (et idéalement un numéro de révision particulier) pour un répertoire suivi en version. Dans Subversion, vous déclarez les définitions externes dans des groupes en utilisant la propriété svn:externals. Vous pouvez créer et modifier cette propriété en utilisant svn propset et svn propedit (voir la section "Manipuler les propriétés"). Elle peut être définie sur tous les répertoires suivis en version et sa valeur est un tableau multi-lignes contenant des sous-répertoires (relativement au répertoire sur lequel la propriété est définie), des indicateurs de révision optionnels et des URL absolues et complètes de dépôts Subversion.

  $ svn propget svn:externals calc
  elements-exterieurs/sons                http://sounds.red-bean.com/repos
  elements-exterieurs/themes              http://skins.red-bean.com/repositories/skinproj
  elements-exterieurs/themes/toolkit -r21 http://svn.red-bean.com/repos/skin-maker

The convenience of the svn:externals property is that once it is set on a versioned directory, everyone who checks out a working copy with that directory also gets the benefit of the externals definition. In other words, once one person has made the effort to define those nested working copy checkouts, no one else has to bother—Subversion will, upon checkout of the original working copy, also check out the external working copies.

L'un des attraits de la propriété svn:externals est qu'une fois qu'elle est définie pour un répertoire suivi en version, chaque utilisateur qui extraie une copie de travail de ce répertoire bénéficie des définitions externes. En d'autres termes, une fois qu'un utilisateur a fait l'effort de définir les extractions externes liées à la copie de travail, tout le monde en bénéficie automatiquement : Subversion, lors de l'extraction de la copie de travail originale, extraira également les copies de travail externes.

WARNING

The relative target subdirectories of externals definitions must not already exist on your or other users' systems—Subversion will create them when it checks out the external working copy.
Les sous-répertoires cibles des définitions externes ne doivent pas déjà exister sur votre système ou sur le systèmes des autres utilisateurs : Subversion les créera lors de l'extraction des copies de travail externes.

Note the previous externals definition example. When someone checks out a working copy of the calc directory, Subversion also continues to check out the items found in its externals definition.

$ svn checkout http://svn.example.com/repos/calc
A  calc
A  calc/Makefile
A  calc/integer.c
A  calc/button.c
Checked out revision 148.

Fetching external item into calc/third-party/sounds
A  calc/third-party/sounds/ding.ogg
A  calc/third-party/sounds/dong.ogg
A  calc/third-party/sounds/clang.ogg
…
A  calc/third-party/sounds/bang.ogg
A  calc/third-party/sounds/twang.ogg
Checked out revision 14.

Fetching external item into calc/third-party/skins
…

Notez que, dans l'exemple précédent de définitions externes, quand quelqu'un extraie une copie de travail du répertoire calc, Subversion continue d'extraire les éléments trouvés dans les définitions externes :

$ svn checkout http://svn.exemple.com/depot/calc
A  calc
A  calc/Makefile
A  calc/entier.c
A  calc/bouton.c
Révision 148 extraite.

Récupération de la référence externe dans 'calc/elements-exterieurs/sons'
A  calc/elements-exterieurs/sons/ding.ogg
A  calc/elements-exterieurs/sons/dong.ogg
A  calc/elements-exterieurs/sons/clang.ogg
…
A  calc/elements-exterieurs/sons/bang.ogg
A  calc/elements-exterieurs/sons/twang.ogg
Révision 14 extraite.

Récupération de la référence externe dans 'calc/elements-exterieurs/themes'
…

If you need to change the externals definition, you can do so using the regular property modification subcommands. When you commit a change to the svn:externals property, Subversion will synchronize the checked-out items against the changed externals definition when you next run svn update. The same thing will happen when others update their working copies and receive your changes to the externals definition.

Si vous avez besoin de modifier des définitions externes, vous pouvez le faire en utilisant les commandes classiques de modification des propriétés. Une fois propagée une modification de la propriété svn:externals, c'est lors de la mise à jour suivante que Subversion synchronisera les éléments déjà extraits avec ceux qui viendront des définitions externes. Le même processus a lieu pour les autres utilisateurs lorsqu'ils mettent à jour leur copie de travail et reçoivent vos modifications des définitions externes.

TIP

Because the svn:externals property has a multiline value, we strongly recommend that you use svn propedit instead of svn propset.
Comme la valeur de la propriété svn:externals est constituée de plusieurs lignes, nous vous recommandons fortement d'utiliser svn propedit plutôt que svn propset.

TIP

You should seriously consider using explicit revision numbers in all of your externals definitions. Doing so means that you get to decide when to pull down a different snapshot of external information, and exactly which snapshot to pull. Besides avoiding the surprise of getting changes to third-party repositories that you might not have any control over, using explicit revision numbers also means that as you backdate your working copy to a previous revision, your externals definitions will also revert to the way they looked in that previous revision, which in turn means that the external working copies will be updated to match they way they looked back when your repository was at that previous revision. For software projects, this could be the difference between a successful and a failed build of an older snapshot of your complex codebase.
Il est particulièrement conseillé d'utiliser des numéros de révision explicites dans toutes vos définitions externes. Ainsi, vous conserverez la possibilité de décider quand rapatrier une nouvelle version de vos informations externes, et quelle version exacte rapatrier. En plus de vous éviter la surprise de recevoir des changements effectués sur des dépôts tiers dont vous n'avez pas la maîtrise, l'utilisation de numéros de révisions explicites signifie aussi que si vous revenez à une version de travail antérieure, vos définitions externes reviendront elles aussi à leur version antérieure. Cela signifie aussi que ces copies de travail externes seront mises à jour pour refléter leur état au moment de la révision antérieure. Pour des projets logiciels, cela peut faire la différence entre une compilation réussie et une compilation ratée d'une version antérieure de votre ensemble complexe de code source.

The svn status command also recognizes externals definitions, displaying a status code of X for the disjoint subdirectories into which externals are checked out, and then recursing into those subdirectories to display the status of the external items themselves.

The support that exists for externals definitions in Subversion is less than ideal, though. First, an externals definition can only point to directories, not files. Second, the externals definition cannot point to relative paths (paths like ../../skins/myskin). Third, the working copies created via the externals definition support are still disconnected from the primary working copy (on whose versioned directories the svn:externals property was actually set). And Subversion still only truly operates on non-disjoint working copies. So, for example, if you want to commit changes that you've made in one or more of those external working copies, you must run svn commit explicitly on those working copies—committing on the primary working copy will not recurse into any external ones.

La commande svn status reconnaît également les définitions externes et affiche la lettre X pour les sous-répertoires, séparés, dans lesquels des éléments externes sont extraits. Ensuite, elle parcourt récursivement les sous-répertoires pour afficher le statut des éléments externes eux-mêmes.

Cependant, le support des définitions externes dans Subversion n'est pas parfait. Premièrement, une définition externe ne peut faire référence qu'à un répertoire, pas à un fichier. Deuxièmement, les définitions externes ne peuvent pas pointer vers des chemins relatifs (tels que ../../themes/mon-theme). Troisièmement, les copies de travail créées par des définitions externes restent déconnectées de la copie de travail originale (sur laquelle la propriété svn:externals avait été définie). Enfin, Subversion n'agit en fait réellement que sur les copies de travail locales d'un seul tenant : par exemple, si vous voulez propager les changements que vous avez effectués sur une ou plusieurs de ces copies de travail externes, vous devez lancer la commande svn commit explicitement sur ces copies de travail (la propagation de modifications de la copie de travail originale ne parcourra pas récursivement les copies de travail externes).

Also, since the definitions themselves use absolute URLs, moving or copying a directory to which they are attached will not affect what gets checked out as an external (though the relative local target subdirectory will, of course, move with renamed directory). This can be confusing—even frustrating—in certain situations. For example, say you have a top-level directory named my-project, and you've created an externals definition on one of its subdirectories (my-project/some-dir) which tracks the latest revision of another of its subdirectories (my-project/external-dir).

$ svn checkout http://svn.example.com/projects .
A    my-project
A    my-project/some-dir
A    my-project/external-dir
…
Fetching external item into 'my-project/some-dir/subdir'
Checked out external at revision 11.

Checked out revision 11.
$ svn propget svn:externals my-project/some-dir
subdir http://svn.example.com/projects/my-project/external-dir

$

Par ailleurs, puisque les définitions utilisent des URL absolues, déplacer ou copier un répertoire auquel une propriété est associée ne modifiera pas ce qui est extrait (alors qu'un sous-répertoire local sera lui bien déplacé avec le répertoire). Ceci peut être une source de confusion, voire de frustration, dans certaines situations. Par exemple, si vous avez un répertoire racine appelé mon-projet et que vous créez une définition externe sur l'un des sous-répertoires (mon-projet/un-rep), qui le fait pointer vers la dernière révision d'un autre sous-répertoire (mon-projet/rep-externe) :

$ svn checkout http://svn.exemple.com/projets .
A    mon-projet
A    mon-projet/un-rep
A    mon-projet/rep-externe
…
Récupération de la référence externe dans 'mon-projet/un-rep/sous-rep'
Référence externe actualisée à la révision 11.

Actualisé à la révision 11.
$ svn propget svn:externals mon-projet/un-rep
subdir http://svn.exemple.com/projets/mon-projet/rep-externe
$

Now you use svn move to rename the my-project directory. At this point, your externals definition will still refer to a path under the my-project directory, even though that directory no longer exists.

$ svn move -q my-project renamed-project
$ svn commit -m "Rename my-project to renamed-project."
Deleting       my-project
Adding         my-renamed-project

Committed revision 12.
$ svn update

Fetching external item into 'renamed-project/some-dir/subdir'
svn: Target path does not exist
$

Maintenant, utilisez la commande svn move pour renommer le répertoire mon-projet. A ce moment là, vos définitions externes feront toujours référence à un chemin sous le répertoire mon-projet, même si ce répertoire n'existe plus :

$ svn move -q mon-projet nouveau-projet
$ svn commit -m "Renommé mon-projet en nouveau-projet."
Suppression    mon-projet
Ajout          nouveau-projet

Révision 12 propagée.
$ svn update

Récupération de la référence externe dans 'nouveau-projet/un-rep/sous-rep'
svn: Le dépôt http://svn.exemple.com/projets/mon-projet/rep-externe n'existe pas 

$

Also, the absolute URLs that externals definitions use can cause problems with repositories that are available via multiple URL schemes. For example, if your Subversion server is configured to allow everyone to check out the repository over http:// or https://, but only allow commits to come in via https://, you have an interesting problem on your hands. If your externals definitions use the http:// form of the repository URLs, you won't be able to commit anything from the working copies created by those externals. On the other hand, if they use the https:// form of the URLs, anyone who might be checking out via http:// because their client doesn't support https:// will be unable to fetch the external items. Be aware, too, that if you need to re-parent your working copy (using svn switch --relocate), externals definitions will not also be re-parented.

De plus, les URL absolues utilisées par les définitions externes peuvent causer des problèmes pour les dépôts accessibles via plusieurs types d'URL. Par exemple, si votre serveur Subversion est configuré pour autoriser tout le monde à consulter le dépôt via http:// ou https://, mais que les opérations de propagation doivent être effectuées uniquement via https://, vous vous retrouvez bien embêté. Si vos définitions externes font référence à la forme http://, vous ne pourrez pas effectuer de propagation depuis les copies de travail créées via ces définitions externes. D'un autre côté, si vous utilisez la forme https:// pour les URL, ceux qui voudront effectuer des consultations via http://, parce que leur client ne sait pas traiter le https://, seront incapables de récupérer les éléments externes. Soyez conscient également que si vous avez besoin de déplacer toute votre copie de travail (avec svn switch --relocate), les définitions externes ne seront pas mises à jour en conséquence.

Finally, there might be times when you would prefer that svn subcommands would not recognize, or otherwise operate upon, the external working copies. In those instances, you can pass the --ignore-externals option to the subcommand.

Finalement, il y aura des occasions où vous préférerez que des commandes svn ignorent les définitions externes. Dans ce cas, vous pourrez passer l'option --ignore-externals à la commande svn.