Comment ignorer les fichiers dans Subversion?

645

Comment ignorer les fichiers dans Subversion?

De plus, comment trouver des fichiers qui ne sont pas sous contrôle de version?

andyuk
la source
C'est amusant de voir comment chaque question simple (probablement d'un utilisateur de git) signifie de nombreuses réponses trop compliquées. Si cela se produit, c'est Subversion baby.
Valerio Bozz

Réponses:

738

(Cette réponse a été mise à jour pour correspondre au comportement de SVN 1.8 et 1.9)

Vous avez 2 questions:

Marquage des fichiers comme ignorés:

Par «fichier ignoré», je veux dire que le fichier n'apparaîtra pas dans les listes même comme «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 expliqués 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 versions ultérieures, prend en charge 3 façons différentes de spécifier les modèles de fichiers. Voici un résumé avec des exemples:

1 - Zone de configuration du runtime - global-ignoresoption:

  • Il s'agit d'un paramètre côté client uniquement , de sorte que votre global-ignoresliste ne sera pas partagée par d'autres utilisateurs et s'applique à tous les dépôts que vous retirez sur votre ordinateur.
  • Ce paramètre est défini dans votre fichier de zone de configuration d'exécution:
    • Windows (basé sur des fichiers) - C:\Users\{you}\AppData\Roaming\Subversion\config
    • Windows (basé sur le registre) - Software\Tigris.org\Subversion\Config\Miscellany\global-ignoresdans HKLMet HKCU.
    • Linux / Unix - ~/.subversion/config

2 - La svn:ignorepropriété, qui est définie sur des répertoires (pas des fichiers):

  • Ceci est stocké dans le référentiel, donc les autres utilisateurs auront les mêmes fichiers ignorés. Similaire au .gitignorefonctionnement.
  • svn:ignoreest 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 svn:ignorepropriété 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/ignoreThisn'est donc pas ignoré, même si " ignoreThis.txt" est appliqué à la .racine du référentiel).

  • Par conséquent, pour appliquer une liste d'ignorance de manière récursive, vous devez utiliser svn propset svn:ignore <filePattern> . --recursive.

    • Cela créera une copie de la propriété dans chaque sous-répertoire.
    • Si la <filePattern>valeur est différente dans un répertoire enfant, alors la valeur de l'enfant remplace complètement les parents, il n'y a donc pas d'effet "additif".
    • Donc, si vous changez le <filePattern>à la racine ., vous devez le changer avec --recursivepour le remplacer dans les répertoires enfant et descendant.
  • Je note que la syntaxe de ligne de commande est contre-intuitive.

    • J'ai commencé en supposant que vous ignoreriez un fichier dans SVN en tapant quelque chose comme svn ignore pathToFileToIgnore.txtcela, mais ce n'est pas ainsi que fonctionne la fonction Ignorer de SVN.

3- La svn:global-ignorespropriété. Nécessite SVN 1.8 (juin 2013):

  • Ceci est similaire svn:ignore, sauf qu'il utilise la fonctionnalité "propriétés héritées" de SVN 1.8.
  • Comparé à svn:ignore, le modèle de fichier est automatiquement appliqué dans chaque répertoire descendant (pas seulement les enfants immédiats).
    • Cela signifie qu'il n'est pas nécessaire de définir svn:global-ignoresl' --recursiveindicateur, 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 à la svn:global-ignoresplace:

    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!
    

Pour les utilisateurs de TortoiseSVN:

Tout cet arrangement était déroutant pour moi, car la terminologie de TortoiseSVN (telle qu'elle est utilisée dans leur système de menus de l'Explorateur Windows) était initialement trompeuse pour moi - je ne savais pas quelle était la signification des "Ajouter récursivement", "Ajouter *" et "Ajouter" du menu Ignorer les options. J'espère que ce post explique comment la fonctionnalité 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 compreniez comment cela fonctionne 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.

Liste des fichiers ignorés:

La commande svn statusmasquera les fichiers ignorés (c'est-à-dire les fichiers qui correspondent à un global-ignoresmodèle RGA , ou qui correspondent au modèle d'un répertoire parent immédiat svn:ignoreou qui correspondent au modèle d'un répertoire ancesor svn:global-ignores.

Utilisez l' --no-ignoreoption pour voir ces fichiers répertoriés. Les fichiers ignorés ont le statut I, puis dirigez la sortie vers greppour n'afficher que 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!

andyuk
la source
6
Pour rechercher des fichiers ignorés: svn status -u -v --no-ignore | grep "^ I" | awk "{print \ $ 2}"
Christian Madsen
3
si vous voulez ignorer le fichier ./FolderA/FolderB/FileToIgnore, faites-le depuis votre. dossier: svn propset svn: ignorer "FileToIgnore" FolderA / FolderB /
jnj
8
si vous êtes ssh'ing svn propedit svn:ignore .et qu'aucun éditeur de texte n'est configuré, vous obtiendrez un message d'erreur indiquant svn: E205007: Aucune des variables d'environnement SVN_EDITOR, VISUAL ou EDITOR n'est définie, et aucune option de configuration au moment de l'exécution 'editor-cmd' n'a été trouvé au lieu d'ouvrir un éditeur. Il suffit donc de spécifier - nitor-cmd nano comme celui-cisvn propedit svn:ignore . --editor-cmd nano
Jonathan Morales Vélez
12
Vous pouvez également ignorer les fichiers avec un nom de fichier spécifique dans tous les sous-dossiers en utilisant l'argument "--recursive". ie svn propset svn: ignore "* .jpg". --recursive
Templar
2
svn status | grep '^?'
Grep
91

Utilisez la commande suivante pour créer une liste qui ne se trouve pas sous les fichiers de contrôle de version.

svn status | grep "^\?" | awk "{print \$2}" > ignoring.txt

Modifiez ensuite le fichier pour ne laisser que les fichiers que vous souhaitez réellement ignorer . Utilisez ensuite celui-ci pour ignorer les fichiers répertorié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 courant.

Supprimez le fichier:

rm ignoring.txt

Enfin, engagez,

svn ci --message "ignoring some files"

Vous pouvez ensuite vérifier quels fichiers sont ignorés via:

svn proplist -v
ulitosCoder
la source
2
Agréable. Une amélioration mineure est svn status | awk "/^?/ {print \$2}" > ignoring.txt.
Dirk Eddelbuettel
4
pourquoi supprimer le fichier? gardez-le en dépôt si vous devez recréer / ajouter / supprimer
tgkprog
Notez que cette solution n'ignorera pas les fichiers dans les sous-répertoires (même s'ils apparaissent dans ignoring.txt).
shaneb
Cela garderait-il les ignorés existants? Sinon, comment le faire en une seule commande (c'est-à-dire --no-ignore et conserve également les lignes précédées de I)?
a1an
Cela écraserait vos ignorés actuels, essayez: svn pg svn:ignore . >> ignore.txtaprès la première commande d'ajouter les ignorés actuels au fichier.
ulitosCoder
55

.gitignore comme approche

Vous pouvez ignorer un fichier ou un répertoire comme .gitignore. Créez simplement un fichier texte de 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 de fichier texte, vous pouvez le faire comme ceci:

svn propset svn:ignore "first
 second
 third" .

Source: Blog de Karsten - Définir svn: ignorer pour plusieurs fichiers à partir de la ligne de commande

Adrian Enriquez
la source
1
Notez que si vous modifiez ultérieurement votre fichier ignoré, vous devez réexécuter la svn:ignorecommande (voir stackoverflow.com/a/58380306/189518 )
Sensei James
50

Si vous utilisez TortoiseSVN , cliquez avec le bouton droit sur un fichier, puis sélectionnez TortoiseSVN / Ajouter pour ignorer la liste . Cela ajoutera le fichier / caractère générique à la svn:ignorepropriété.

svn:ignoresera vérifié lors de l'archivage des fichiers et les fichiers correspondants seront ignorés. J'ai la liste d'ignorance suivante pour un projet Visual Studio .NET:

bin obj
*.exe
*.dll
_ReSharper
*.pdb
*.suo

Vous pouvez trouver cette liste dans le menu contextuel à TortoiseSVN / Propriétés .

artur02
la source
27

Comme personne ne semble l'avoir mentionné ...

svn propedit svn:ignore .

Modifiez ensuite le contenu du fichier pour spécifier les modèles à ignorer, quittez l'éditeur et vous avez terminé.

Yorick
la source
3
Cette réponse était utile. Dans mon cas, je devais changer "." dans le sous-répertoire du fichier que je voulais ignorer et spécifier simplement le modèle de fichier. Aussi, la première fois, j'avais besoin de lancer ceci (je suis sur Mac): export SVN_EDITOR = "nano"
Elijah Lofgren
22

J'ai trouvé l'article .svnignore Exemple pour 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

https://github.com/github/gitignore

d.danailov
la source
1
j'ai fait comme tu l'as dit ... mais quand je lance le statut svn. il montre toujours les fichiers ignorés avec "?"
Harshit Gupta
Je n'ai jamais vérifié avec le statut svn, mais avec svn add * et après cette validation svn, ignorer les fichiers n'est pas valider.
d.danailov
si un fichier "a.txt" est déjà en contrôle de version, alors l'ignorer se fait par la commande comme "svn propset svn: ignore -F .svnignore a.txt"? est-ce correct ?
errakeshpd
Si vous ajoutez "a.txt" dans votre fichier .svnignore, je ne suis pas sûr, mais la commande devrait être correcte.
d.danailov
10

Lorsque vous utilisez propedit, assurez-vous de ne pas avoir d'espaces de fin car cela entraînerait l'exclusion du fichier de la liste des ignorés.

Ceux-ci sont insérés automatiquement si vous avez utilisé tab-autocomplete sur linux pour créer le fichier pour commencer:

svn propset svn:ignore 'file1
file2' .
Kenneth
la source
6
Cela ne fonctionne que pour certains shells, comme bash. Notez que la réexécution de la commande propset écrase le jeu de motifs précédent.
JA Faucett
Donc, file1 et file2 doivent être sur des lignes distinctes?
IgorGanapolsky
8

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:

  1. Obtient les fichiers d'état du svn
  2. Enregistre tous les fichiers avec ? dans le fichier "svnignore.txt"
  3. Obtient les fichiers déjà ignorés et les ajoute au fichier "svnignore.txt"
  4. Indique au svn d'ignorer les fichiers dans "svnignore.txt"
  5. Supprime le fichier
bkbilly
la source
8

De plus, si vous utilisez Tortoise SVN, vous pouvez le faire:

  1. Dans le menu contextuel, sélectionnez "TortoiseSVN", puis "Propriétés"
  2. Dans la fenêtre apparue, cliquez sur "Nouveau", puis sur "Avancé"
  3. Dans la fenêtre apparue en face de "Nom de la propriété", sélectionnez ou tapez "svn: ignore", en face de "Valeur de la propriété", tapez le nom de fichier souhaité ou le nom du dossier ou le masque de fichier (dans mon cas, c'était "* / cible"), cliquez sur "Appliquer" propriété récursivement "
  4. D'accord. D'accord.
  5. Commettre
msangel
la source
6
  1. cd ~ / .subversion
  2. config ouverte
  3. trouver la ligne comme «global-ignore»
  4. définissez ignorer le type de fichier comme ceci: global-ignores = * .o * .lo * .la * .al .libs * .so .so. [0-9] * .pyc * .pyo 88 * .rej ~ # #. # *. *. swp .DS_Store sortie node_modules
范 陆 离
la source
Merci, votre réponse est la seule à mentionner le configdossier.
Henrique de Sousa
Cette réponse le mentionne également @HenriquedeSousa stackoverflow.com/a/86052/7724 et explique également qu'il s'agit d'un moyen local réservé aux clients d'ignorer les fichiers.
bzlm
5

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:

  1. Obtient les fichiers d'état du svn
  2. Enregistre tous les fichiers avec ?dans le fichier "svnignore.txt"
  3. Obtient les fichiers déjà ignorés et les ajoute au fichier "svnignore.txt"
  4. Indique au svn d'ignorer les fichiers dans "svnignore.txt"
  5. Supprime le fichier
LivingDust
la source
J'aime la réponse de bkbilly, mais cette version rompt chaque ligne pour la rendre plus lisible, et supprime le && qui, dans mes tests, n'a rien fait, car la première ligne crée toujours le fichier temporaire, et ce même fichier temporaire entre toujours dans la liste des ignorés.
LivingDust
Une proposition d'édition aurait plus approprié dans ce cas. Appréciez l'effort!
Jim
Je n'avais pas encore assez de réputation pour suggérer une modification. mais je ne veux pas ruiner un bon protocole. Existe-t-il un README simple sur les directives pour savoir quand il est préférable de suggérer et de modifier plutôt que de publier une nouvelle réponse, etc.?
LivingDust
1
Si votre réponse est exactement la même que celle publiée il y a un an et demi, c'est assez simple. Vous avez même copié l' explication « Ce que ça fait ».
Jim
3

Vous pouvez également définir un modèle d'ignorance global dans le fichier de configuration de SVN.

petr k.
la source
1
Pouvez-vous définir un modèle ignorer pour un référentiel spécifique?
David Doria
3

svn status vous dira quels fichiers ne sont pas dans SVN, ainsi que ce qui a changé.

Regardez les propriétés SVN pour la propriété ignore.

Pour toutes les choses SVN, le livre rouge est une lecture obligatoire.

DGM
la source
2

Utilisez la commande svn status sur votre copie de travail pour afficher l'état des fichiers, les fichiers qui ne sont pas encore sous contrôle de version (et non ignorés) auront un point d'interrogation à côté d'eux.

Pour ignorer les fichiers, vous devez modifier la propriété svn: ignore, lisez le chapitre Ignorer les éléments non versionnés dans le svnbook à http://svnbook.red-bean.com/en/1.5/svn.advanced.props.special.ignore. html . Le livre décrit également plus sur l'utilisation du statut svn.

Andreas Holstenson
la source
2

SVN ignore est facile à gérer dans TortoiseSVN. Ouvrez TortoiseSVN et faites un clic droit sur le menu fichier, puis sélectionnez Ajouter à ignorer la liste.

Cela ajoutera les fichiers dans la svn:ignorepropriété. Lorsque nous archivons les fichiers, ceux qui correspondent àsvn:ignore ceux-ci 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

Mou
la source
2

Ce qui a fonctionné pour moi:

Comment ignorer les fichiers dans Subversion?
1.Dans l'Explorateur de fichiers, faites un clic droit sur le nom du dossier du projet SVN
2.Cliquez sur "SVN Valider ..."
3.Une fenêtre " Valider" apparaîtra
4. Faites un clic droit sur le dossier / fichier que vous souhaitez ignorer
5.Cliquez sur Ajouter pour ignorer la liste
6.Sélectionnez le dossier / fichier
7.Commettez le "changement de propriété" à SVN

De plus, comment trouver des fichiers qui ne sont pas sous contrôle de version?
Après l'étape 3 ci-dessus, cliquez sur "Afficher les fichiers non versionnés"

jumping_monkey
la source
0
  1. ouvrez vous utilisez le produit JetBrains (par exemple Pycharm)
  2. puis cliquez sur le bouton «valider» dans la barre d'outils supérieure ou utilisez le raccourci «ctrl + k» screenshot_toolbar
  3. sur l'interface de validation, déplacez vos fichiers indésirables vers une autre liste de modifications comme suit. screenshot_commit_change
  4. la prochaine fois, vous ne pourrez valider que la liste des modifications par défaut.
G. Googol
la source