This text is a work in progress—highly subject to change—and may not accurately describe any released version of the Apache™ Subversion® software. Bookmarking or otherwise referring others to this page is probably not such a smart idea. Please visit http://www.svnbook.com/ for stable versions of this book.
Dans n'importe quelle copie de travail, il y a de grandes chances que les fichiers et dossiers suivis en versions côtoient d'autres fichiers et dossiers non suivis en versions ou qui n'ont pas lieu de l'être. Les éditeurs de texte remplissent les dossiers avec des fichiers de sauvegarde. Les compilateurs créent des fichiers intermédiaires (ou même des fichiers finaux) que vous ne voudrez pas suivre en versions. Et les utilisateurs eux-mêmes déposent des fichiers et des dossiers où bon leur semble, souvent dans des copies de travail locales.
Il est ridicule de penser que les copies de travail Subversion échappent à ce type de méli-mélo. En fait, Subversion prend en compte (c'est une fonctionnalité) dès le début que les copies de travail sont des dossiers comme les autres, comme ceux qui ne sont pas suivis en versions. Mais ces fichiers et dossiers qui-n-ont-pas-vocation-à-être-suivis-en-versions peuvent perturber les utilisateurs de Subversion. Par exemple, comme les commandes svn add et svn import sont récursives par défaut et ne savent pas quels fichiers de l'arborescence vous voulez suivre ou non en versions, il est relativement facile d'ajouter au suivi de versions des éléments que vous ne vouliez pas suivre. Et comme la commande svn status liste, par défaut, tous les éléments intéressants de la copie de travail, y compris les fichiers et dossiers non suivis en versions, son affichage devient rapidement confus avec de tels imbroglios.
C'est pourquoi Subversion fournit plusieurs méthodes pour pouvoir lui indiquer quels fichiers vous souhaitez ignorer. La première implique l'utilisation de la zone de configuration (voir la section intitulée « Zone de configuration des exécutables ») et, par conséquent, s'applique à toutes les opérations Subversion qui utilisent cette zone de configuration, généralement toutes celles de l'ordinateur ou d'un utilisateur particulier de l'ordinateur. Deux autres méthodes utilisent les propriétés Subversion des dossiers et sont plus liées à l'arborescence suivie en versions elle-même. Par conséquent, elles affectent tous ceux qui possèdent une copie de travail de cette arborescence. Tous ces mécanismes utilisent des motifs de noms de fichiers (des chaines de caractères simples ou des jokers) pour trouver des correspondances avec les noms de fichiers qu'il faut ignorer.
La zone de configuration de Subversion propose une directive,
global-ignores
, dont la valeur est un ensemble
de motifs de noms de fichiers séparés par des espaces. Le client
Subversion compare ces motifs aux noms des fichiers que l'on tente
d'ajouter au suivi de versions, ainsi qu'aux noms des fichiers non
suivis en versions détectés par la commande svn
status. Si un nom de fichier correspond au motif,
Subversion ignore totalement ce fichier. C'est particulièrement
utile pour les fichiers que vous ne voulez jamais suivre en
versions, comme les fichiers de sauvegarde créés par les éditeurs
de texte (par exemple, les fichiers *~
et
.*~
créés par Emacs).
Pour un dossier suivi en versions, la propriété
svn:ignore
est supposée contenir une liste de
motifs de noms de fichiers (un motif par ligne) que Subversion
utilise pour déterminer quels objets ignorer dans le dossier
concerné. Ces motifs ne remplacent pas les motifs inscrits dans
la directive global-ignores
de la zone de
configuration, mais s'ajoutent à cette liste. Veuillez également
noter que, contrairement à la directive
global-ignores
, les motifs de la propriété
svn:ignore
s'appliquent uniquement au dossier pour lequel la propriété est
définie et pas à ses sous-dossiers. La propriété
svn:ignore
est utile pour indiquer à Subversion
d'ignorer les fichiers susceptibles d'être présents dans la copie
de travail de ce dossier chez chaque utilisateur comme les fichiers
produits par les compilateurs ou, pour citer un exemple plus approprié
à ce livre, les fichiers HTML, PDF ou PostScript générés par la
conversion des fichiers sources DocBook XML vers un format de fichier
plus lisible.
Subversion 1.8 fournit une version plus puissante de la
propriété svn:ignore
: la propriété
svn:global-ignores
. Comme la propriété
svn:ignore
,
svn:global-ignores
ne peut être définie que
pour un dossier et elle contient les motifs de noms de fichiers
que Subversions doit ignorer[21]. Ces motifs à
ignorer sont aussi ajoutés aux motifs définis dans la zone de
configuration par la directive global-ignores
et à ceux définis par la propriété svn:ignore
.
Contrairemen à svn:ignore
, la propriété
svn:global-ignores
s'hérite[22] et elle s'applique à tous les
chemins placés sous le dossier sur lequel la propriété est
définie, pas seulement les fils directs de ce dossier.
Note | |
---|---|
Le support des motifs de fichiers à ignorer dans Subversion s'applique uniquement à la procédure d'ajout de fichiers et dossiers non suivis en versions vers la gestion de versions. Une fois que l'objet est suivi en versions par Subversion, les mécanismes permettant d'ignorer certains fichiers selon des motifs prédéfinis ne s'appliquent plus. Autrement dit, ne pensez pas que Subversion ne propagera pas les changements que vous avez faits à un fichier suivi en versions simplement parce que son nom correspond à un motif à ignorer : Subversion prend toujours en compte l'ensemble des objets qu'il gère. |
La liste globale des motifs à ignorer définie dans la
directive global-ignores
de la zone de
configuration reste une affaire de goût[23], car elle doit davantage s'intégrer à la
collection d'outils de l'utilisateur que répondre aux besoins
d'une copie de travail particulière. C'est pourquoi le reste de
cette section s'attache à décrire l'utilisation des propriétés
svn:ignore
et
svn:global-ignores
.
Prenons par exemple le résultat suivant de la commande svn status :
M calc/bouton.c ? calc/calculatrice ? calc/donnees.c ? calc/debug_log ? calc/debug_log.1 ? calc/debug_log.2.gz ? calc/debug_log.3.gz
Dans cet exemple, des modifications ont été faites sur les
propriétés de bouton.c
et il y a aussi des
fichiers non suivis en versions : le programme
calculatrice
(résultat de votre dernière
compilation du code source), un fichier source
donnees.c
et un ensemble de fichiers de
traces pour le débogage. Vous êtes conscient du fait que compiler
votre code engendre à chaque fois la création du programme
calculatrice
[24].
Vous savez également que vous avez toujours des fichiers de
traces qui traînent. On peut faire ce constat pour toutes les
copies de travail locales de ce projet, pas seulement la vôtre. Et
vous savez que cela ne vous intéresse pas et que cela n'intéresse
très probablement aucun autre développeur, de voir ces fichiers
apparaître à chaque commande svn status. Vous
allez donc utiliser svn propedit svn:ignore calc
pour ajouter des motifs à ignorer pour le dossier
calc
.
$ svn propget svn:ignore calc calculatrice debug_log* $
Après avoir ajouté cette propriété, vous avez une propriété
modifiée localement dans votre dossier
calc
. Mais notez les autres différences sur
le résultat de la commande
svn status :
$ svn status M calc M calc/bouton.c ? calc/donnees.c
Maintenant, tout le superflu a disparu ! Bien sûr, votre
programme compilé et les fichiers de trace sont toujours présents
dans votre copie locale. Subversion ne vous présente pas ces
fichiers présents mais non suivis en versions, c'est tout. Et
maintenant que ces parasites sont supprimés de l'affichage, il ne
vous reste plus que les éléments intéressants, tels que le fichier
source donnees.c
que vous avez
probablement oublié d'ajouter au suivi de versions.
Bien évidemment, ce compte-rendu plus succinct de l'état de
votre copie de travail locale n'est pas le seul possible. Si vous
voulez voir les fichiers ignorés dans le compte-rendu, vous pouvez
ajouter l'option --no-ignore
à la commande
Subversion :
$ svn status --no-ignore M calc M calc/bouton.c I calc/calculatrice ? calc/donnees.c I calc/debug_log I calc/debug_log.1 I calc/debug_log.2.gz I calc/debug_log.3.gz
Tous les fichiers non suivis en versions auparavant occultés
apparaissent de nouveau, mais avec un état I
pour Ignoré. Mais attendez, qu'en est-il du fichier
wip.1.diff
? La propriété
svn:ignore
définie sur
calc
ne comporte aucun motif qui corresponde
à ce nom de fichier, alors pourquoi est-il occulté[25] ? La réponse réside dans la troisième méthode
qu'utilise Subversion pour ignorer les chemins non suivis en
versions, la propriété héritée
svn:global-ignores
. Utilisez la sous-commande
svn propget avec l'option
--show-inherited-props
,vous verrez alors que la
propriété svn:global-ignores
est définie à la
racine de votre copie de travail et, pour sûr, qu'elle définit
un motif qui correspond au nom de fichier cherché :
$ svn pg svn:global-ignores calc -v --show-inherited-props Propriétés héritées sur 'calc' de '.': svn:global-ignores *.diff *.patch
Comme mentionné auparavant, la liste des motifs de fichiers à
ignorer est aussi utilisée par svn add et
svn import. Ces deux opérations demandent à
Subversion de gérer un ensemble de fichiers et de dossiers.
Plutôt que de forcer l'utilisateur à choisir dans l'arborescence
quels fichiers il souhaite suivre en versions, Subversion utilise
les motifs de fichiers à ignorer, à la fois la liste globale et
ceux définis par dossier, pour déterminer quels fichiers suivre
(ou ne pas suivre) en versions dans sa procédure récursive d'ajout
ou d'import. Là encore, vous pouvez utiliser l'option
--no-ignore
pour indiquer à Subversion d'ignorer
ces listes et de d'agir effectivement sur tous les fichiers et
dossiers présents.
Astuce | |
---|---|
Même si |
[21] Les motifs de la
propriété svn:global-ignores
doivent être
séparés par des blancs (comme pour la directive
global-ignores
de la zone de configuration),
pas uniquement des fins de lignes (au contraire de la propriété
svn:ignore
).
[22] Naturellement, seuls les clients Subversion 1.8 ou plus
récents reconnaîtront l'héritage et la signification de la
propriété svn:global-ignores
!
[23] Bien que ce soit une affaire de goût, si vous ne
définissez pas explicitement de valeur pour la directive
global-ignores
dans la zone de configuration,
soit avec votre ensemble préféré de motifs, soit avec une
chaine vide, alors Subversion utilise une valeur par défaut.
Regardez l'entrée global-ignores
dans
la section intitulée « Configuration générale ».
[24] N'est-ce pas précisément la finalité d'un système de compilation ?
[25] Supposons que vous n'avez pas non plus de motif qui
corresponde dans la directive global-ignores
de la zone de configuration.