Lorsque l'on travaille au sein d'un répertoire dont le contrôle de version est soumis à subversion, il est très fréquent qu'apparaissent des fichiers qui n'ont pas lieu d'être géré par le gestionnaire de contrôle de version et dont il n'est pas nécessaire d'indiquer les modifications ou même la présence lors d'un svn status.

Sous cvs, le fichier .cvsignore était utilisé pour gérer les exceptions à ne pas soumettre au contrôle de version. Subversion intègre un système plus souple qui se base sur la gestion des propriétés.

Subversion et les propriétés : propget, propset, proplist

Au sein d'un dépôt subversion, tous les fichiers, les dossiers ainsi que le dépôt en général ont des propriétés. Ces dernières peuvent être définies automatiquement (la propriété svn:executable par exemple) ou bien manuellement. Vous pouvez connaître les propriétés d'un fichier ou d'un dépôt à l'aide de la commande svn proplist :

shell:~/mon-depot$ svn proplist
Propriétés sur '.'
  license
  svn:ignore

Pour connaître la valeur d'une propriété, il suffit d'utiliser la commande svn propget suivie du nom de la propriété et du répertoire ou du fichier dont on veut connaître la propriété. Si aucun fichier n'est précisé, le répertoire courant est considéré.

shell:~/mon-depot$ svn propget license
GPLv2

La propriété svn:ignore

La propriété svn:ignore est celle qui nous intéresse. Elle permet de spécifier les motifs de fichiers à ignorer au sein d'un répertoire. La syntaxe permettant de spécifier cette propriété est la suivante : svn propset svn:ignore -F <fichier_des_motifs> <repertoire>.

Par exemple, dans le cadre d'un dépôt de fichiers en Python, il est inutile de conserver dans le dépôt les versions compilés des sources Python (*.pyc), on peut donc indiquer au gestionnaire de les ignorer :

shell:~/mon-depot$ cat > .svn/svnignore <<EOF
> *.pyc
> EOF
shell:~/mon-depot$ svn propset svn:ignore -F .svn/svnignore .
Propriété 'svn:ignore' définie sur '.'

Ou bien pour un dépôt de fichiers LaTeX, on peut ignorer tous les fichiers de compilation intermédiaires : les *.log, *.aux, *.bbl, *.blg, ... :

shell:~/mon-depot$ cat > .svn/svnignore <<EOF
> *.aux
> *.log
> *.bbl
> *.blg
> EOF
shell:~/mon-depot$ svn propset svn:ignore -F .svn/svnignore .
Propriété 'svn:ignore' définie sur '.'
shell:~/mon-depot$ svn proplist
Propriétés sur '.'
  svn:ignore
shell:~/mon-depot$ svn propget svn:ignore
*.aux
*.log
*.bbl
*.blg

ATTENTION! La propriété svn:ignore n'est pas appliquée de manière récursive, il est donc nécessaire de la spécifier manuellement pour chaque dossier dans lequel vous souhaitez qu'elle s'appliquer

shell:~/mon-depot$ svn status
 M     .
?      annexes/main.tex
?      annexes/Annexes.aux
M      annexes/Annexes.tex
?      notes_a-_integrer/unites_bloc_detection.aux
?      notes_a-_integrer/unites_bloc_detection.bbl
?      notes_a-_integrer/unites_bloc_detection.log
?      notes_a-_integrer/unites_bloc_detection.blg
?      notes_a-_integrer/unites_bloc_detection.pdf
M      Makefile
shell:~/mon-depot$ svn propset svn:ignore -F .svn/svnignore annexes/ notes_a-_integrer/
Propriété 'svn:ignore' définie sur 'annexes'
Propriété 'svn:ignore' définie sur 'notes_a-_integrer'
shell:~/mon-depot$  svn status
 M     .
?      annexes/main.tex
 M     annexes
M      annexes/Annexes.tex
?      notes_a-_integrer/unites_bloc_detection.pdf
 M     notes_a-_integrer
M      Makefile

Si toutefois vous avez un doute quant aux fichiers ignorés grâce à cette propriété, vous pouvez forcer svn à l'ignorer à l'aide de l'option --no-ignore :

shell:~/mon-depot$ svn status --no-ignore
 M     .
?      annexes/main.tex
I      annexes/Annexes.aux
I      annexes/Annexes.tex~
 M     annexes
M      annexes/Annexes.tex
I      notes_a-_integrer/unites_bloc_detection.aux
I      notes_a-_integrer/unites_bloc_detection.tex~
I      notes_a-_integrer/unites_bloc_detection.bbl
I      notes_a-_integrer/unites_bloc_detection.log
I      notes_a-_integrer/unites_bloc_detection.blg
?      notes_a-_integrer/unites_bloc_detection.pdf
 M     notes_a-_integrer
M      Makefile