Comment ignorer des fichiers dans Subversion?
Aussi, comment trouver des fichiers qui ne sont pas sous contrôle de version?
(Cette réponse a été mise à jour pour correspondre au comportement de SVN 1.8 et 1.9)
Vous avez 2 questions:
Par "fichier ignoré", je veux dire que le fichier n'apparaîtra pas dans les listes même s'il est "non versionné": votre client SVN prétendra que le fichier n'existe pas du tout dans le système de fichiers.
Les fichiers ignorés sont spécifiés par un "modèle de fichier". La syntaxe et le format des modèles de fichiers sont décrits dans la documentation en ligne de SVN: http://svnbook.red-bean.com/nightly/en/svn.advanced.props.special.ignore.html "Modèles de fichiers dans Subversion ".
Subversion, à partir de la version 1.8 (juin 2013) et ultérieure, prend en charge 3 manières différentes de spécifier des modèles de fichiers. Voici un résumé avec des exemples:
global-ignores
:global-ignores
ne sera pas partagée par d’autres utilisateurs. Elle s’applique à toutes les mises en pension que vous extrayez sur votre ordinateur.C:\Users\{you}\AppData\Roaming\Subversion\config
Software\Tigris.org\Subversion\Config\Miscellany\global-ignores
à la fois HKLM
et HKCU
.~/.Subversion/config
svn:ignore
, définie sur les répertoires (pas les fichiers):.gitignore
.svn:ignore
est appliqué aux répertoires et est non récursif ou hérité. Tout fichier ou sous-répertoire immédiat du répertoire parent correspondant au modèle de fichier sera exclu.Alors que SVN 1.8 ajoute le concept de "propriétés héritées", la propriété svn:ignore
elle-même est ignorée dans les répertoires descendants non immédiats:
cd ~/myRepoRoot # Open an existing repo.
echo "foo" > "ignoreThis.txt" # Create a file called "ignoreThis.txt".
svn status # Check to see if the file is ignored or not.
> ? ./ignoreThis.txt
> 1 unversioned file # ...it is NOT currently ignored.
svn propset svn:ignore "ignoreThis.txt" . # Apply the svn:ignore property to the "myRepoRoot" directory.
svn status
> 0 unversioned files # ...but now the file is ignored!
cd subdirectory # now open a subdirectory.
echo "foo" > "ignoreThis.txt" # create another file named "ignoreThis.txt".
svn status
> ? ./subdirectory/ignoreThis.txt # ...and is is NOT ignored!
> 1 unversioned file
(Le fichier ./subdirectory/ignoreThis
n'est donc pas ignoré, même si "ignoreThis.txt
" est appliqué à la racine du référentiel .
).
Par conséquent, pour appliquer une liste de non-respect de manière récursive, vous devez utiliser svn propset svn:ignore <filePattern> . --recursive
.
<filePattern>
est différente dans un répertoire enfant, la valeur de l'enfant remplace complètement les parents, il n'y a donc pas d'effet "additif".<filePattern>
sur le .
racine, vous devez le changer avec --recursive
pour le remplacer dans les répertoires enfant et descendant.Je remarque que la syntaxe de la ligne de commande est contre-intuitive.
svn ignore pathToFileToIgnore.txt
, mais ce n'est pas ainsi que fonctionne la fonction ignorer de SVN.svn:global-ignores
. Nécessite SVN 1.8 (juin 2013):svn:ignore
, sauf qu'il utilise la fonctionnalité "Propriétés héritées" de SVN 1.8.svn:ignore
, le modèle de fichier est automatiquement appliqué dans chaque répertoire de descendant (pas seulement les enfants immédiats) .svn:global-ignores
avec l'indicateur --recursive
, car les modèles de fichiers ignorés hérités sont automatiquement appliqués lorsqu'ils sont hérités.Exécuter le même ensemble de commandes que dans l'exemple précédent, mais en utilisant svn:global-ignores
à la place:
cd ~/myRepoRoot # Open an existing repo
echo "foo" > "ignoreThis.txt" # Create a file called "ignoreThis.txt"
svn status # Check to see if the file is ignored or not
> ? ./ignoreThis.txt
> 1 unversioned file # ...it is NOT currently ignored
svn propset svn:global-ignores "ignoreThis.txt" .
svn status
> 0 unversioned files # ...but now the file is ignored!
cd subdirectory # now open a subdirectory
echo "foo" > "ignoreThis.txt" # create another file named "ignoreThis.txt"
svn status
> 0 unversioned files # the file is ignored here too!
Tout cet arrangement était déroutant pour moi, car la terminologie de TortoiseSVN (telle qu'utilisée dans leur système de menus de Windows Explorer) m'avait initialement induite en erreur - je ne savais pas quelle était la signification des options "Ajouter de manière récursive", "Ajouter *" et "Ajouter" options. J'espère que cet article explique comment la fonction Ignorer est liée à la fonctionnalité Propriétés SVN. Cela dit, je suggère d'utiliser la ligne de commande pour définir les fichiers ignorés afin que vous ayez une idée de son fonctionnement au lieu d'utiliser l'interface graphique, et d'utiliser uniquement l'interface graphique pour manipuler les propriétés une fois que vous êtes à l'aise avec la ligne de commande.
La commande svn status
masquera les fichiers ignorés (c'est-à-dire les fichiers qui correspondent à un modèle RGA global-ignores
ou au modèle svn:ignore
d'un répertoire parent immédiat ou au modèle svn:global-ignores
de tout autre répertoire ancesor.
Utilisez l'option --no-ignore
pour voir ces fichiers listés. Les fichiers ignorés ont un statut de I
, puis dirigez la sortie vers grep
pour afficher uniquement les lignes commençant par "I".
La commande est:
svn status --no-ignore | grep "^I"
Par exemple:
svn status
> ? foo # An unversioned file
> M modifiedFile.txt # A versioned file that has been modified
svn status --no-ignore
> ? foo # An unversioned file
> I ignoreThis.txt # A file matching an svn:ignore pattern
> M modifiedFile.txt # A versioned file that has been modified
svn status --no-ignore | grep "^I"
> I ignoreThis.txt # A file matching an svn:ignore pattern
ta-da!
Utilisez la commande suivante pour créer une liste ne se trouvant pas dans les fichiers de contrôle de version.
svn status | grep "^\?" | awk "{print \$2}" > ignoring.txt
Editez ensuite le fichier dans ne laissez que les fichiers que vous souhaitez ignorer . Ensuite, utilisez celui-ci pour ignorer les fichiers listés dans le fichier:
svn propset svn:ignore -F ignoring.txt .
Notez le point à la fin de la ligne. Il indique à SVN que la propriété est définie sur le répertoire en cours.
Supprimer le fichier:
rm ignoring.txt
Enfin commettre,
svn ci --message "ignoring some files"
Vous pouvez ensuite vérifier quels fichiers sont ignorés via:
svn proplist -v
Si vous utilisez TortoiseSVN , cliquez avec le bouton droit sur un fichier, puis sélectionnez TortoiseSVN/Add pour ignorer la liste. Cela ajoutera le fichier/caractère générique à la propriété svn:ignore
.
svn:ignore
sera vérifié lorsque vous archivez des fichiers et les fichiers correspondants seront ignorés. J'ai la liste suivante d'ignorer pour un projet Visual Studio .NET:
bin obj
*.exe
*.dll
_ReSharper
*.pdb
*.suo
Vous pouvez trouver cette liste dans le menu contextuel à l'adresse TortoiseSVN/Properties.
Vous pouvez ignorer un fichier ou un répertoire tel que .gitignore. Créez simplement un fichier texte contenant la liste des répertoires/fichiers que vous souhaitez ignorer et exécutez le code ci-dessous:
svn propset svn:ignore -F ignorelist.txt .
OU si vous ne voulez pas utiliser un fichier texte, vous pouvez le faire comme ceci:
svn propset svn:ignore "first
second
third" .
Source: Karsten's Blog - Définir svn: ignore plusieurs fichiers en ligne de commande
J'ai trouvé l'article .svnignore Example for Java.
Exemple: .svnignore pour Ruby on Rails,
/log
/public/*.JPEG
/public/*.jpeg
/public/*.png
/public/*.gif
*.*~
Et après ça:
svn propset svn:ignore -F .svnignore .
Exemples pour .gitignore. Vous pouvez utiliser pour votre .svnignore
Comme personne ne semble l'avoir mentionné ...
svn propedit svn:ignore .
Ensuite, éditez le contenu du fichier pour spécifier les motifs à ignorer, quittez l'éditeur et vous avez terminé.
Lorsque vous utilisez propedit, assurez-vous de ne pas avoir d'espaces de fin, car le fichier sera exclu de la liste des ignorés.
Ceux-ci sont insérés automatiquement si vous utilisez tab-autocomplete sur linux pour créer le fichier avec lequel commencer:
svn propset svn:ignore 'file1
file2' .
Une autre solution est:
svn st | awk '/^?/{print $2}' > svnignore.txt && svn propget svn:ignore >> svnignore.txt && svn propset svn:ignore -F svnignore.txt . && rm svnignore.txt
ou ligne par ligne
svn st | awk '/^?/{print $2}' > svnignore.txt
svn propget svn:ignore >> svnignore.txt
svn propset svn:ignore -F svnignore.txt .
rm svnignore.txt
Ce qu'il fait:
De plus, si vous utilisez Tortoise SVN, vous pouvez le faire:
Une version plus lisible de la réponse de bkbilly:
svn st | awk '/^?/{print $2}' > svnignore.txt
svn propget svn:ignore >> svnignore.txt
svn propset svn:ignore -F svnignore.txt .
rm svnignore.txt
Ce qu'il fait:
SVN ignore
est facile à gérer dans TortoiseSVN. Ouvrez TortoiseSVN et cliquez avec le bouton droit sur le menu Fichier, puis sélectionnez Ajouter pour ignorer la liste.
Cela ajoutera les fichiers dans la propriété svn:ignore
. Lorsque nous archiverons les fichiers, ceux qui correspondent à svn:ignore
seront ignorés et ne seront pas validés.
Dans le projet Visual Studio, nous avons ajouté les fichiers suivants à ignorer:
bin obj
*.exe
*.dll
*.pdb
*.suo
Nous gérons le code source sur SVN de Comparetrap en utilisant cette méthode avec succès
svn status
vous indiquera quels fichiers ne sont pas dans SVN, ainsi que ce qui a changé.
Recherchez les propriétés SVN pour la propriété ignore.
Pour tout ce qui concerne SVN, le Livre rouge est une lecture obligatoire.
Vous pouvez également définir un motif d'ignorance global dans le fichier de configuration de SVN.
Ajouter un répertoire à Subversion et ignorer le contenu du répertoire
svn propset svn:ignore '\*.*' .
ou
svn propset svn:ignore '*' .
Utilisez la commande svn status sur votre copie de travail pour afficher le statut des fichiers. Les fichiers qui ne sont pas encore sous contrôle de version (et non ignorés) auront un point d'interrogation à leur côté.
Pour ignorer les fichiers, vous devez éditer la propriété svn: ignore, lisez le chapitre Ignorer les éléments non versionnés du livre svnbook à l'adresse http://svnbook.red-bean.com/fr/1.5/svn.advanced.props.special. ignore.html . Le livre décrit également plus en détail l'utilisation de svn status.