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 répertoires suivis en versions côtoient d'autres fichiers et répertoires non suivis en versions ou qui n'ont pas lieu de l'être. Les éditeurs de texte remplissent les répertoires 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 répertoires 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 répertoires comme les autres, comme ceux qui ne sont pas suivis en versions. Mais ces fichiers et répertoires 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 répertoires non suivis en versions, son affichage devient rapidement confus avec de tels imbroglios.

C'est pourquoi Subversion fournit deux méthodes pour 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. L'autre méthode utilise les propriétés Subversion des répertoires et est plus liée à l'arborescence suivie en versions elle-même. Par conséquent, elle affecte tous ceux qui possèdent une copie de travail de cette arborescence. Les deux 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).

La zone de configuration de Subversion propose une option, global-ignores, dont la valeur est un ensemble de motifs de noms de fichiers (appelés aussi globs) 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 répertoire 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 répertoire 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 répertoire pour lequel la propriété est définie et pas à ses sous-répertoires. 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 répertoire chez chaque utilisateur comme par exemple 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.

[Note] Note

Le support des motifs de fichiers à ignorer dans Subversion s'applique uniquement à la procédure d'ajout de fichiers et répertoires 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 est une affaire de goût, devant plus s'intégrer à la collection d'outils d'un utilisateur particulier 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 de la propriété svn:ignore.

Prenons par exemple le résultat suivant de la commande svn status :

$ svn status calc
 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 [13]. 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 répertoire calc. Par exemple, vous pouvez ajouter ce qui suit comme nouvelle valeur de la propriété svn:ignore :

calculatrice
debug_log*

Après avoir ajouté cette propriété, vous avez une propriété modifiée localement dans votre répertoire 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

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 répertoires. 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 répertoire, 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 répertoires présents.

[Astuce] Astuce

Même si svn:ignore est défini, 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 répertoire en cours ne sera pas négligé car déjà suivi en versions et l'option --force force Subversion à parcourir ce répertoire, ajoutant les fichiers non suivis en versions, tout en respectant la propriété svn:ignore et la variable global-ignores de la zone de configuration. Pensez à 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 répertoire de façon récursive.



[13] N'est-ce pas précisément la finalité d'un système de compilation ?