SVN: ignore certains répertoires de manière récursive

106

Je ne veux pas qu'un répertoire soit nommé buildou distqu'il entre dans mon SVN, quelle que soit la profondeur de l'arborescence.

Est-ce possible? Dans git je viens de mettre

build
dist

dans mon .gitignoreà la racine et il ignore récursivement. Comment faire cela avec svn? S'il vous plaît ne me dites pas de faire un propset sur chaque répertoire parent ...

Paul Tarjan
la source
Cochez cette réponse pour une solution native si vous utilisez Subversion 1.8.
Frank Kusters

Réponses:

57

Depuis la subversion 1.8, il y a maintenant la svn:global-ignorespropriété qui fonctionne comme svn:ignoremais de manière récursive (donc définissez ceci sur votre répertoire de niveau supérieur)

double
la source
3
Je suis un peu confus - il y a global-ignoresdans le ~/.subversion/configfichier, mais aussi la propriété héritable svn:global-ignores définie sur un répertoire dans un dépôt SVN, ainsi que svn:ignore- pouvez-vous fournir un résumé de ces différentes options et comment elles se comparent? Comment le --recursivedrapeau les affecte-t-il aussi?
Dai
2
J'ai fait mes propres recherches et publié mes résultats dans cette réponse QA: stackoverflow.com/a/86052/159145
Dai
[J'ai essayé mais échoué, le objdossier est toujours affiché] ( stackoverflow.com/questions/50960188/… ), pouvez-vous m'aider à y jeter un œil?
Luke
Puis-je dire "build / *" aller ignorer tout ce qui se trouve sous build dans chaque dossier de build?
Johannes Schaub - litb
45

svn propsetprend --recursiveen option, vous pouvez donc le faire, avec deux inconvénients:

  1. vous devez extraire tout le référentiel (ou au moins tous les répertoires qu'il contient), et
  2. vous devez vous rappeler de définir la svn:ignorepropriété chaque fois que vous ajoutez un nouveau répertoire
Michael Hackner
la source
42

Il n'est pas possible de faire cela. Il n'y a que deux mécanismes d' svn:ignoreignorance dans Subversion, (qui n'est pas récursif) et global-ignores(qui n'est pas spécifique à un référentiel).

Kevin Reid
la source
7
svn propset --recursive svn: ignore svn_ignore_rules. où svn_ignore_rules est un fichier contenant les règles d'ignorer - une par ligne
georg
3
'svn propset --recursive svn: ignore --file svn_ignore_rules.' pour moi avec svn-1.7.6, sinon vous ignorez récursivement les fichiers nommés 'svn_ignore_rules' [edit: selon 'wytten' dans un commentaire ci-dessous]
elbeardmorez
9
Aux commentateurs: Comme l'a dit le demandeur, "S'il vous plaît ne me dites pas de faire un propset sur chaque répertoire parent ...".
Kevin Reid le
5
C'est maintenant possible dans Subversion 1.8
Squirrel
17

Cela fonctionne pour moi:

 svn propset --recursive svn:ignore *.zip <dir_tree_with_no_zips>
Stewart
la source
2
Merci pour cela, fonctionne très bien ... Au fait, le seul moyen que j'ai trouvé pour ignorer à la fois * .txt et * .pdf était de mettre ces modèles dans un fichier, puis d'utiliser l'option 'svn propset --file'
wytten
13

ajoutez à votre fichier ~ / .subversion / config ou / etc / subversion / config:

[miscellany]
global-ignores = build dist
jspcal
la source
Je préfère le faire par pension si je peux
Paul Tarjan
1
hmm je ne sais pas s'il existe un moyen facile de le faire par dépôt, un hook pré-commit pourrait rejeter certains modèles, mais ce n'est pas une solution complète. svn: ignore sur chaque répertoire parent fonctionne, mais pas de manière récursive. vous pouvez échanger votre fichier de configuration avec un script lorsque vous travaillez sur différents dépôts, mais c'est une étape supplémentaire.
jspcal le
1
Que signifie build dist ?
IgorGanapolsky
9

Il est possible d'ignorer les répertoires build et dist en supprimant les répertoires du contrôle de version. L'astuce consiste à utiliser l'option --keep-local pour laisser le répertoire dans la copie de travail. Par exemple:

svn rm dist --keep-local
svn ci -m'removed build directory from version control'

Le répertoire ne sera plus suivi par subversion mais il sera toujours là dans votre copie de travail pour contenir la sortie du compilateur, etc.

bravo, Joe

jsharit
la source
7

Par exemple la structure des dossiers:

Project/
Project/dist/

cd Project
svn propset svn:ignore '*' dist/
svn ci -m "content of dist ignored"

Il est bon de faire une suppression svn du contenu dist avant la commande ignore, donc pour les branches dist sera vide.

A travaillé pour moi, testé aujourd'hui. Voici la page qui l'explique un peu

marian
la source
6

Afin d'ignorer tous ces fichiers dans tous les référentiels, vous pouvez ajouter un global-ignoresà votre fichier de configuration par utilisateur.

Sur les systèmes de type Unix, cette zone apparaît sous la forme d'un répertoire nommé .subversion dans le répertoire personnel de l'utilisateur. Sur les systèmes Win32, Subversion crée un dossier nommé Subversion, généralement dans la zone Données d'application du répertoire de profil de l'utilisateur

Voir les options de configuration

Malheureusement, il n'y a pas d'option par référentiel pour faire cela. C'est essentiellement par utilisateur, ou par répertoire, donc le multiple svn:ignoresest probablement la voie à suivre, aussi ennuyeux que cela puisse être.

Blair Conrad
la source
1
Je préfère le faire par dépôt si je peux
Paul Tarjan
Oh, alors vous n'avez pas de chance. Comme le dit @Kevin Reid - vous avez par répertoire ou par utilisateur.
Blair Conrad le
6

Vous devez d'abord vous déplacer vers le dossier supérieur de votre copie de travail et y créer un fichier (par exemple .svnignore) où vous devez placer tous les modèles que vous souhaitez ignorer, par exemple (pour un projet Android):

bin
gen
proguard
.classpath
.project
local.properties
Thumbs.db
*.apk
*.ap_
*.class
*.dex

Ensuite, vous exécutez la commande suivante (rappelez-vous que vous devez être dans le dossier supérieur de votre copie de travail):

svn propset svn:ignore -R -F .svnignore .

Cela ne fonctionnera que pour les dossiers et fichiers qui ne sont pas encore sous contrôle de version. Si vous souhaitez qu'un dossier (ou fichier) en cours de version soit également ignoré, supprimez-le du contrôle de version en exécutant la commande:

svn rm --keep-local <path>

Vous avez tout cela dans cet excellent article qui explique tout: http://superchlorine.com/2013/08/getting-svn-to-ignore-files-and-directories/

Lucques Correa
la source
Cela a été extrêmement utile. C'est le meilleur moyen que j'ai trouvé pour obtenir un comportement ignoré de type git dans svn. Merci beaucoup.
Jonathan Wilson
6

Dans la subversion 1.8 over, il est possible de définir global-ignores pour le référentiel actuel.

svn propset svn:global-ignores build .
svn propset svn:global-ignores dist .

Vous pouvez également créer un dossier nommé .svnignore et écrire des conditions.

build
dist

souvenez-vous d'une condition par ligne, définir build / * ou dist / debug est en vain. Ensuite, exécutez la commande:

svn propset svn:global-ignores -F .svnignore .
John Zhu
la source
fonctionne parfaitement! exécutez simplement la première commande sur le repo nouvellement extrait.
gaurav le
3

Créez un fichier et ajoutez-y vos ignorés

ingore-list:

file1 
directory1
file2
etc...

puis appliquez la commande suivante

for n in directory; do svn propset svn:ignore -F ignore-list $n; done

répertoire est le nom de votre répertoire, vous pouvez également sous-catégoriser répertoire / sous-répertoire. Ou utilisez * pour noter le répertoire actuel dans lequel vous vous trouvez.

Cela suppose que vous utilisez bash comme shell

jncc99
la source
Quel est le $ n ici?
IgorGanapolsky
1
@igor Ganapolsky - Le $ n est la variable de la boucle for. Il sera défini comme index de la séquence dans laquelle vous bouclez; dans ce cas, le répertoire spécifié par "répertoire" dans l'exemple ci-dessus.
jncc99
3
svn propset --recursive svn:ignore svn_ignore_rules .

où svn_ignore_rules est un fichier contenant les règles d'ignorer - une par ligne

Bien sûr, vous devez le réexécuter chaque fois que vous ajoutez un nouveau répertoire à votre dépôt

svn_ignore_rules peut également être considéré comme archivé dans le référentiel, comme réutilisable par d'autres utilisateurs ayant un accès en écriture au référentiel

Georg
la source
2
cd parent_dir # le répertoire contenant le dossier à ignorer récursivement
svn propedit svn: ignorer. # ouvrira svn-prop.tmp
enrôler le (s) dossier (s)
^ X
Oui
commit -m 'ignorer la direcoty ciblée'
Moin Haidar
la source
m'a aidé, j'ai eu problème avec le modèle de dossier de réglage, SVN a été complianing ce dossier non repo, set EDITOR=notepad, svn propedit svn:ignore .a bien fonctionné ...
Betlista
1

Puisqu'il ne semble pas y avoir de solution à ce problème probablement courant, je voudrais partager notre solution. Comme les autres l'ont déjà précisé, vous pouvez soit utiliser la svn:ignorepropriété, cela s'applique à un seul répertoire (et donc pas pour les nouveaux), soit vous utiliser global-ignoresqui s'applique à un seul utilisateur (mais n'appartient pas au référentiel).

Pour rendre la vie un peu plus facile, j'ai créé un fichier reg nommé Settings.Svn.reget l' ai ajouté à la racine du référentiel. Maintenant, tout le monde peut double-cliquer une fois sur ce regfile et a fait les réglages.

REGEDIT4

[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\miscellany]
"global-ignores"="obj *.suo *.bak *.pdb *.user *.Cache*"

J'apprécierais vraiment une solution dans le référentiel SVN, donc si quelqu'un le sait, voudriez-vous la partager?

martinstoeckli
la source
0

Une façon serait d'ajouter une sorte de vérification au hook pré- ou post-commit, mais c'est simple si vous ne possédez pas le serveur de dépôt.

8DH
la source