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.

Occultation des éléments non suivis en versions

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] 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] Astuce

Même si svn:ignore ou svn:global-ignores sont définies, vous risquez de rencontrer des problèmes si vous utilisez des caractères spéciaux du shell dans une commande. Les caractères spéciaux sont remplacés par une liste explicite de cibles avant que Subversion n'agisse sur eux et donc lancer svn SOUS-COMMANDE * revient à lancer svn SOUS-COMMANDE fichier1 fichier2 fichier3 …. Dans le cas de la commande svn add, ceci a un effet similaire à l'option --no-ignore. Par conséquent, au lieu d'utiliser un caractère spécial, utilisez plutôt svn add --force . pour marquer d'un seul coup les éléments non suivis en versions pour ajout. La cible explicite permet de s'assurer que le dossier en cours ne sera pas négligé car déjà suivi en versions et l'option --force force Subversion à parcourir ce dossier, ajoutant les fichiers non suivis en versions, tout en respectant les propriétés svn:ignore et sv:global-ignores ainsi que la directive global-ignores de la zone de configuration. Pensez aussi à rajouter l'option --depth files à la commande svn add si vous ne voulez pas que la recherche de fichiers à ajouter au suivi de versions ne parcoure le dossier de façon récursive.



[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.