Comment ignorer un répertoire avec SVN?

760

Je viens de commencer à utiliser SVN et j'ai un répertoire de cache dont je n'ai pas besoin sous contrôle de source. Comment puis-je ignorer tout le répertoire / dossier avec SVN?

J'utilise Versions et TextMate sur OS X et ligne de commande.

Gilean
la source
3
Réponse à une question similaire ici [SVN checkout ignore folder] [1] [1]: stackoverflow.com/questions/192824/svn-checkout-ignore-folder
mloskot
Copie possible de Comment ignorer les fichiers dans Subversion? (Je ne me soucie pas trop de la direction du doublon; aucun des deux ensembles de réponses n'est évidemment meilleur que l'autre.)
Jeffrey Bosboom

Réponses:

796

Définissez la svn:ignorepropriété du répertoire parent:

svn propset svn:ignore dirname .

Si vous devez ignorer plusieurs éléments, séparez-les par des retours à la ligne dans la valeur de la propriété. Dans ce cas, il est plus facile de modifier la valeur de la propriété à l'aide d'un éditeur externe:

svn propedit svn:ignore .
Jason Cohen
la source
2
@Kouber: Votre problème est que l'expansion du shell ne connaît pas les propriétés svn: ignore. Donc, utiliser '*' comme paramètre explicityl passe tmp à la commande commit. Essayez quelque chose comme 'svn commit -m "More accents".'
MarkusSchaber
4
Merci d'avoir répondu. Pico en tant qu'éditeur: svn propedit svn: ignore. --editor-cmd pico
hade
157
Remarque: Cela ne fonctionnera pas si le répertoire est déjà "dans" svn. svn rm --keep-local dirnamepremière. (Ma sortie de statistiques svn était énorme et je me suis cogné la tête pendant un moment.)
Erik Aronesty
10
Si vous souhaitez ignorer plusieurs fichiers / dossiers, ajoutez tous leurs noms à un fichier txt, une ligne chacun, et utilisez la variante suivante:svn propset svn:ignore -F file.txt .
petervaz
2
Soyez prudent que vous définissez svn:ignoreet pas svn::ignorecomme je l'ai fait. Vous pouvez définir des propriétés arbitraires, donc cette dernière sera définie sur OK, et vous pouvez voir et modifier la propriété, mais cela ne fera pas ignorer SVN les fichiers que vous listez.
Richard Turner
406

Voici un exemple de structure de répertoire:

\project
    \source
    \cache
    \other

Une projectfois dedans, vous voyez que votre répertoire de cache n'est pas ajouté et apparaît comme tel.

> svn st
M  source
?  cache

Pour définir la propriété ignore, faites

svn propset svn: ignorer le cache.

svn:ignoreest le nom de la propriété que vous définissez, cachela valeur de la propriété et .le répertoire sur lequel vous définissez cette propriété. Il doit s'agir du répertoire parent du cacherépertoire qui a besoin de la propriété.

Pour vérifier quelles propriétés sont définies:

> svn proplist
Properties on '.':
  svn:ignore

Pour voir la valeur de svn:ignore:

> svn propget svn:ignore
cache

Pour supprimer des propriétés précédemment définies:

svn propdel svn:ignore
craigb
la source
17
Un point délicat ici que je suis tombé sur. Assurez-vous de ne pas ajouter de barre oblique de fin dirname. Par exemple, lors de la frappe svn propset svn:ignore dirname, si vous autorisez le shell (bash) à remplir le nom du répertoire pour vous, il ajoutera cette barre oblique de fin, vous laissant avec la commande svn propset svn:ignore dirname/, ce qui n'entraîne pas l'ignorance du dossier. Du moins, ce fut mon expérience.
David Weinraub
4
Le répertoire «cache» sera toujours répertorié dans «svn st». Existe-t-il un moyen de le supprimer de la vue? (sans supprimer du disque)
Tom Brito
131

Important à mentionner:

Sur la ligne de commande, vous ne pouvez pas utiliser

svn add *

Cela ajoutera également les fichiers ignorés, car la ligne de commande se développe *et svn addpense donc que vous souhaitez que tous les fichiers soient ajoutés. Utilisez donc ceci à la place:

svn add --force .
binco
la source
faites exactement ce que @binco a dit: svn add --force *NE FONCTIONNERA PAS. Utilisez le point, pas l'étoile.
manuell
80

Étant donné que j'ai passé un certain temps à essayer de faire fonctionner cela, il convient de noter que si les fichiers existent déjà dans SVN, vous en avez besoin svn delete, puis modifiez la svn:ignorepropriété.

Je sais que cela semble évident, mais ils ont continué à apparaître comme ?dans ma svn statusliste, quand j'ai pensé que cela les ignorerait localement.

Kai
la source
8
N'oubliez pas d'utiliser l'option --keep-local lors de la suppression des fichiers si vous souhaitez simplement les ignorer et ne pas les supprimer.
Dylan Holmes du
71

Pour développer légèrement, si vous faites cela avec l'outil de ligne de commande svn, vous voulez taper:

svn propedit svn:ignore path/to/dir

qui ouvrira l'éditeur de texte de votre choix, puis tapez '*' pour ignorer tout ce qu'il contient, et enregistrer + quitter - cela inclura le répertoire lui-même dans svn, mais ignorera tous les fichiers qu'il contient, pour ignorer le répertoire, utilisez le chemin du parent, puis tapez le nom du répertoire dans le fichier. Après l'enregistrement, exécutez une mise à jour («svn up»), puis vérifiez le chemin d'accès approprié.

Greg
la source
8
Très bon point, merci. Toutes les autres réponses ont manqué la casse des répertoires imbriqués. Ainsi, l'exemple ci-dessus (qui fonctionne) que vous tapez dans l'éditeur ignored_directory (qui est par hypothèse un niveau en dessous de path / to / dir). Cela ne fonctionnera pas cependant: svn propedit svn: ignore. puis en tapant path / to / dir / ignored_directory dans l'éditeur. IOW: SVN fait correspondre les objets d'un niveau à la fois.
greenoldman
30

Définissez la svn:ignorepropriété sur le répertoire parent:

$ cd parentdir
$ svn ps svn:ignore . 'cachedir'

Cela écrasera toute valeur actuelle de svn:ignore. Vous pouvez éditer la valeur avec:

$ svn pe svn:ignore .

Ce qui ouvrira votre éditeur. Vous pouvez ajouter plusieurs modèles, un par ligne.

Vous pouvez afficher la valeur actuelle avec:

$ svn pg svn:ignore .

Si vous utilisez une interface graphique, il devrait y avoir une option de menu pour ce faire.

Frank Szczerba
la source
3
svn ps svn:ignore . 'cachedir'résulte en cachedir is not under version control. changer pour svn ps svn:ignore 'cachedir' .travailler pour moi
DiCaprio
21

Merci pour toutes les contributions ci-dessus. Je voudrais juste partager quelques informations supplémentaires de mes expériences tout en ignorant les fichiers.


Lorsque les dossiers sont déjà sous contrôle de révision

Après l' importation svn et svn co les fichiers, ce que nous faisons habituellement pour la première fois.

Tout le cache d'exécution, les dossiers de pièces jointes seront sous contrôle de version. donc, avant svn ps svn: ignore , nous devons le supprimer du dépôt.

Avec SVN version 1.5 ci-dessus, nous pouvons utiliser svn del --keep-local your_folder, mais pour une version antérieure, ma solution est:

  1. svn exporter une copie propre de vos dossiers (sans .svndossier caché)
  2. svn del le local et le référentiel,
  3. svn ci
  4. Copiez les dossiers
  5. Faites svn st et confirmez que les dossiers sont marqués comme '?'
  6. Maintenant, nous pouvons faire svn ps selon les solutions

Lorsque nous avons besoin de plusieurs dossiers à ignorer

  • Dans un répertoire, j'ai deux dossiers qui doivent être définis comme svn:ignore
  • Si nous en définissons un, l'autre sera supprimé.
  • Alors on se demande qu'on a besoin de svn pe

svn pedevra modifier le fichier texte, et vous pouvez utiliser cette commande si nécessaire pour définir votre éditeur de texte à l'aide de vi :

export SVN_EDITOR=vi
  1. Avec "o", vous pouvez ouvrir une nouvelle ligne
  2. Tapez tous les noms de dossiers que vous souhaitez ignorer
  3. Appuyez sur la touche «esc» pour sortir du mode édition
  4. Tapez ": wq" puis appuyez sur Enterpour enregistrer et quitter

Le fichier ressemble simplement à ceci:

runtime
cache
attachments
assets
Elliot Yap
la source
vous pouvez également utiliser svn propset svn:ignore -F .ignorethesefiles ., qui utilisera le contenu du fichier. J'aime le garder pour que vous sachiez ce qui est ignoré. Les modifications nécessitent un ensemble de suivi.
Gerard ONeill
20

Retirez-le d'abord ...

Si votre répertoire fooest déjà sous contrôle de version, supprimez-le d'abord avec:

svn rm --keep-local foo

... puis ignorez:

svn propset svn:ignore foo .
brûlures mates
la source
12

... et si vous voulez ignorer plus d'un répertoire (disons build/ temp/et *.tmpfichiers), vous pouvez soit le faire en deux étapes (ignorer la première et modifier les propriétés ignorer (voir les autres réponses ici)) soit écrire quelque chose comme

svn propset svn:ignore "build
temp
*.tmp" .

sur la ligne de commande.

DerMike
la source
12

Si vous utilisez le client SVN particulier TortoiseSVN , puis lors de la validation, vous avez la possibilité de cliquer avec le bouton droit sur les éléments et de sélectionner "Ajouter à ignorer la liste".

Michael Lang
la source
9

La commande pour ignorer plusieurs entrées est un peu délicate et nécessite des barres obliques inverses.

svn propset svn:ignore "cache\
tmp\
null\
and_so_on" .

Cette commande ignore tout nom cache, tmp, nullet and_so_ondans le répertoire courant.

James Stroud
la source
6
Et juste pour clarifier: la barre oblique inverse n'est pas une fonctionnalité de svn; c'est simplement un moyen d'entrer une chaîne multi-lignes sur le shell. Vous pouvez également utiliser un éditeur et écrire simplement plusieurs lignes.
sleske
La barre oblique inverse n'est pas requise pour bash. bash est suffisamment intelligent pour savoir qu'un "est ouvert et ne pas traiter la ligne. Tout ce que vous avez à faire est d'appuyer sur entrée après le cache, tmp et null. Vous verrez que bash change l'invite en> pour que vous vous connaissiez saisissent toujours la commande. Une alternative consiste à commencer à taper la commande (svn), puis à appuyer sur esc puis sur v. Cela vous permettra d'entrer la commande dans l'éditeur. appuyez sur ZZ lorsque vous aurez terminé pour exécuter la commande. si vous changez d'avis et ne veulent pas exécuter, alors: q !.
Michael Potter
1
svn propset svn:ignore -F .ignorethesefiles .vous permettra d'utiliser un fichier. Et comme mentionné, vous avez toujours une autorisation.
Gerard ONeill
5

J'ai eu des problèmes pour ignorer les répertoires imbriqués; le répertoire supérieur que je voulais ignorer ne s'afficherait pas avec «svn status» mais tous les sous-répertoires le faisaient. C'est probablement évident pour tout le monde, mais je pensais le partager:

EXEMPLE:

/tronc

/ trunk / cache

/ trunk / cache / subdir1

/ trunk / cache / subdir2

cd /trunk
svn ps svn:ignore . /cache
cd /trunk/cache
svn ps svn:ignore . *
svn ci
brainycat
la source
4

"Merci" svn pour une manière si hideuse, fausse et difficile d'ignorer les fichiers.

J'ai donc écrit un script svn-ignore-all :

#!/bin/sh

# svn-ignore-all

# usage: 
#   1. run svn status to see what is going on at each step 
#   2. add or commit all files that you DO want to have in svn
#   3. remove any random files that you don't want to svn:ignore
#   4. run this script to svn:ignore everything marked '?' in output of `svn status`

svn status |
grep '^?' |
sed 's/^? *//' |
while read f; do
    d=`dirname "$f"`
    b=`basename "$f"`
    ignore=`svn propget svn:ignore "$d"`
    if [ -n "$ignore" ]; then
        ignore="$ignore
"
    fi
    ignore="$ignore$b"
    svn propset svn:ignore "$ignore" "$d"
done

De plus, pour ignorer une liste spécifique de fichiers / noms de chemin, nous pouvons utiliser cette variante svn-ignore . Je suppose que svn-ignore-all devrait vraiment être comme xargs svn-ignore.

#!/bin/sh

# svn-ignore

# usage:
#   svn-ignore file/to/ignore ...

for f; do
    d=`dirname "$f"`
    b=`basename "$f"`
    ignore=`svn propget svn:ignore "$d"`
    if [ -n "$ignore" ]; then
        ignore="$ignore
"
    fi
    ignore="$ignore$b"
    svn propset svn:ignore "$ignore" "$d"
done

Une dernière chose: j'ai tendance à polluer mes caisses svn avec de nombreux fichiers aléatoires. Quand il est temps de valider, je déplace ces fichiers dans un sous-répertoire «ancien» et je dis à svn d'ignorer «ancien».

Sam Watkins
la source
Salut Sam, c'est un joli script. Une question est apparue dans ma tête: est-ce peut-être que le problème vient du fait que l'ignorance d'un dossier entier qui fait partie du référentiel ne fonctionne pas, nous nous retrouvons donc avec ces '?' des fichiers qui sont essentiellement des fichiers modifiés dans des dossiers que nous avons ajoutés à la liste des ignorés? Je me demande simplement s'il existe un moyen de contourner votre script, car il serait fastidieux de l'exécuter tout le temps. Le faites vous?
SquareCat
non, je ne l'utilise pas vraiment! essayez simplement de nettoyer mes fichiers
Sam Watkins
4

Bash oneliner pour plusieurs ignorés:

svn propset svn:ignore ".project"$'\n'".settings"$'\n'".buildpath" "yourpath"
Fedir RYKHTIK
la source
3

Si votre répertoire de projet est nommé / Project et votre répertoire de cache est nommé / Project / Cache, vous devez définir une propriété subversion sur / Project. Le nom de la propriété doit être "svn: ignore" et la valeur de la propriété doit être "Cache".

Reportez-vous à cette page du manuel Subversion pour en savoir plus sur les propriétés.

Le Digital Gabeg
la source
3

La réponse de Jason fera l'affaire. Cependant, au lieu de définir svn: ignorez "." sur le répertoire cache, vous souhaiterez peut-être inclure "cache" dans la propriété svn: ignore du répertoire parent , au cas où le répertoire cache ne serait pas toujours présent. Je le fais sur un certain nombre de dossiers "jetables".

harpo
la source
3

POUR GARDER LES RÉPERTOIRES QUE SVN IGNORERA:

  1. cela supprimera les fichiers du référentiel, mais gardera le répertoire sous contrôle SVN:

svn delete --keep-local path / directory_to_keep / *

  1. puis paramétrez pour ignorer le répertoire (et tout le contenu):

svn propset svn: ignorer le chemin "*" / directory_to_keep

sheasie
la source
2

Si vous utilisez un frontend pour SVN comme TortoiseSVN, ou une sorte d'intégration IDE, il devrait également y avoir une option ignorer dans le même menu que l'opération commit / add.

Chris Marasti-Georg
la source
1

Définissez la propriété svn: ignore . La plupart des outils de l'interface utilisateur svn ont un moyen de le faire ainsi que la discussion en ligne de commande dans le lien.

Joe Skora
la source
1

Puisque vous utilisez des versions, c'est vraiment très simple:

  • Parcourir votre copie extraite
  • Cliquez sur le répertoire pour ignorer
  • Dans la zone "Ignorer à droite, cliquez sur Modifier
  • Tapez *. * Pour ignorer tous les fichiers (ou * .jpg pour seulement les fichiers jpg, etc.)
Andrew
la source
1

Regardez également vos barres obliques de fin. J'ai constaté que l'inclusion images/*dans mon fichier de paramètres d'ignorance n'ignorait pas ./images/. Quand je courais, svn status -uça montrait encore ? images. Donc, je viens de changer le paramètre ignorer en juste images, sans barres obliques. A effectué une vérification d'état et cela l'a effacé.

cdmo
la source
1

Résolu avec Eclipse de la manière suivante:

Tout d'abord, faites une synchronisation de votre dossier avec le projet:

équipe -> synchroniser

Dans la vue suivante, vue d'équipe, vous pouvez voir toutes les ressources que vous pouvez valider sur le serveur SVN.

Sélectionnez donc le dossier de ressources de la ressource que vous souhaitez ignorer, puis vous pouvez l'ignorer à l'aide

équipe -> ajouter à svn:ignore.

Après cela, dans la fenêtre de confirmation, sélectionnez la première option: "ignorer par nom".

Par exemple, si je veux ignorer le dossier cible et leurs ressources .class, je synchroniserai et dans la vue de synchronisation, je sélectionnerai le dossier cible. Après cela, je vais sélectionner

équipe-> ajouter

à svn:ignorepuis je confirme la première option dans la fenêtre de confirmation.

Antonio Martin
la source
0

Après avoir perdu beaucoup de temps à chercher comment faire cette activité simple, j'ai décidé de publier qu'il n'était pas difficile de trouver une explication décente.

Laissez d'abord la structure de l'échantillon

$ svn st? projet / tronc / cible? project / trunk / myfile.x

1 - configurer d'abord l'éditeur, dans mycase vim export SVN_EDITOR = vim

2 - "svn propedit svn: ignore project / trunk /" ouvrira un nouveau fichier et vous pourrez ajouter vos fichiers et votre sous-répertoire dans le cas type "target" enregistrer et fermer le fichier et fonctionne

$ svn st? project / trunk / myfile.x

Merci.

Bruno Lee
la source