Question Comment ignorer les fichiers dans Subversion?


Comment ignorer les fichiers dans Subversion?

En outre, comment puis-je trouver des fichiers qui ne sont pas sous contrôle de version?


552
2017-09-17 18:15


origine


Réponses:


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

Vous avez 2 questions:

Marquer les 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 différentes façons de spécifier les modèles de fichiers. Voici un résumé avec des exemples:

1 - Zone de configuration d'exécution - global-ignores option:

  • C'est un côté client seulement réglage, de sorte que votre global-ignores La liste ne sera pas partagée par d'autres utilisateurs, et elle s'applique à tous les repos que vous extrayez 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-ignores à la fois HKLM et HKCU.
    • Linux / Unix - ~/.subversion/config

2 - Le svn:ignore propriété, qui est définie sur les répertoires (pas les fichiers):

  • Ceci est stocké dans le repo, de sorte que les autres utilisateurs auront les mêmes fichiers ignorés. Similaire à comment .gitignore travaux.
  • svn:ignore est appliqué aux répertoires et est non-récursif ou hérité. Tout fichier ou immédiat Le sous-répertoire du répertoire parent qui correspond au motif de fichier sera exclu.
  • Alors que SVN 1.8 ajoute le concept de «propriétés héritées», le svn:ignore la proprié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
    

    (Donc le fichier ./subdirectory/ignoreThis n'est pas ignoré, même si "ignoreThis.txt"est appliqué sur le . repo root).

  • Par conséquent, pour appliquer une liste d'ignorés récursivement, vous devez utiliser svn propset svn:ignore <filePattern> . --recursive.

    • Cela va créer une copie de la propriété dans chaque sous-répertoire.
    • Si la <filePattern> La valeur est différente dans un répertoire enfant alors la valeur de l'enfant remplace complètement les parents, donc il n'y a pas d'effet "additif".
    • Donc, si vous changez le <filePattern> sur la racine ., alors vous devez le changer avec --recursive pour l'écraser sur les répertoires enfant et descendant.
  • Je remarque que la syntaxe de la 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.txt Cependant, ce n'est pas ainsi que fonctionne la fonctionnalité d'ignorer SVN.

3- Le svn:global-ignores propriété. Requiert SVN 1.8 (juin 2013):

  • Ceci est similaire à svn:ignore, sauf qu'il fait usage de la fonctionnalité "propriétés héritées" de SVN 1.8.
  • Comparer aux 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 est inutile de définir svn:global-ignores avec le --recursive flag, en tant que modèles de fichiers ignorés hérités sont automatiquement appliqués car ils sont hérités.
  • Exécution du même ensemble de commandes que dans l'exemple précédent, mais en utilisant svn:global-ignores au lieu:

    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, parce que la terminologie de TortoiseSVN (telle qu'utilisée dans leur système de menu Windows Explorer) m'était initialement trompeuse - je ne savais pas quelle était la signification du menu Ignorer "Ajouter récursivement", "Ajouter *" et "Ajouter" options J'espère que cet article 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 d'avoir une idée de la façon dont cela fonctionne au lieu d'utiliser l'interface graphique, et seulement utiliser l'interface graphique pour manipuler les propriétés après la ligne de commande.

Liste des fichiers qui sont ignorés:

La commande svn status va cacher les fichiers ignorés (c'est-à-dire, les fichiers qui correspondent à un RGA global-ignores motif, ou correspondre à un répertoire parent immédiat svn:ignore modèle ou correspondre à tout répertoire de l'ancêtre svn:global-ignores modèle.

Utilisez le --no-ignore option pour voir ces fichiers répertoriés. Les fichiers ignorés ont un statut de I, puis dirigez la sortie vers grep pour ne montrer 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!


658
2017-09-17 18:16



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

Ensuite, éditez le fichier ne laissez que les fichiers que vous voulez ignorer. Ensuite, utilisez 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 en cours.

Supprimer le fichier:

rm ignoring.txt

Enfin, commettez,

svn ci --message "ignoring some files"

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

svn proplist -v

72
2017-10-25 15:20



Si vous utilisez TortoiseSVN, faites un clic droit sur un fichier, puis sélectionnez TortoiseSVN / Ajouter à la liste des ignorés. Cela va ajouter le fichier / wildcard à la svn:ignore propriété.

svn:ignore sera vérifié lorsque vous archivez les fichiers, et les fichiers correspondants seront ignorés. J'ai la liste ignorée 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.


46
2017-09-17 18:35



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 voulez 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: Blog de Karsten - Définir svn: ignore pour plusieurs fichiers de la ligne de commande


34
2017-08-26 09:15



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


19
2018-03-25 20:06



Lors de l'utilisation de propedit assurez-vous de ne pas avoir d'espaces de fin car cela entraînera 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:

svn propset svn:ignore 'file1
file2' .

9
2018-03-01 13:54



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 tout est terminé.


9
2017-07-26 21:37



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 à partir 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. Dit à svn d'ignorer les fichiers dans "svnignore.txt"
  5. Supprime le fichier

8
2018-05-29 11:54



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 à partir 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. Dit à svn d'ignorer les fichiers dans "svnignore.txt"
  5. Supprime le fichier

6
2017-12-01 01:07