SVN: ignora alcune directory in modo ricorsivo


106

Non voglio alcuna directory denominata buildo distche vada nel mio SVN, non importa quanto sia profonda nell'albero.

È possibile? In git ho appena messo

build
dist

in my .gitignorealla radice e ignora ricorsivamente. Come posso farlo con svn? Per favore, non dirmi di fare un propset su ogni directory genitore ...


Controlla questa risposta per una soluzione nativa se stai usando Subversion 1.8.
Frank Kusters,

Risposte:


57

A partire da subversion 1.8, ora c'è la svn:global-ignoresproprietà che funziona come svn:ignorema in modo ricorsivo (quindi impostalo nella directory di primo livello)


3
Sono un po 'confuso - c'è global-ignoresnel ~/.subversion/configfile, ma anche la proprietà ereditabile svn:global-ignores impostata su una directory in un repository SVN, nonché svn:ignore- puoi fornire un riepilogo di queste diverse opzioni e come si confrontano? In che modo la --recursivebandiera influisce anche su di loro?
Dai

2
Ho fatto le mie ricerche e pubblicato i miei risultati in questa risposta QA: stackoverflow.com/a/86052/159145
Dai

[Ho provato ma non ci sono riuscito, la objcartella è ancora visibile] ( stackoverflow.com/questions/50960188/… ), puoi aiutarmi a dare un'occhiata?
Luca

Posso dire "build / *" per ignorare tutto ciò che è sotto build all'interno di ogni cartella build?
Johannes Schaub - litb

45

svn propsetprende --recursivecome opzione, quindi puoi farlo, con due aspetti negativi:

  1. devi controllare l'intero repository (o almeno tutte le directory in esso contenute) e
  2. devi ricordarti di impostare la svn:ignoreproprietà ogni volta che aggiungi una nuova directory

42

Non è possibile farlo. Ci sono solo due meccanismi di ignora in Subversion, svn:ignore(che non è ricorsivo) e global-ignores(che non è specifico di un repository).


7
svn propset --recursive svn: ignora svn_ignore_rules. dove svn_ignore_rules è un file contenente le regole di ignoranza - una per riga
georg

3
'svn propset --recursive svn: ignore --file svn_ignore_rules.' per me con svn-1.7.6, altrimenti ignori ricorsivamente i file denominati "svn_ignore_rules" [modifica: come da "wytten" in un commento qui sotto]
elbeardmorez

9
Ai commentatori: come ha detto il richiedente, "Per favore, non dirmi di fare un propset su ogni directory genitore ...".
Kevin Reid

5
Ora è possibile in Subversion 1.8
Squirrel

17

Questo funziona per me:

 svn propset --recursive svn:ignore *.zip <dir_tree_with_no_zips>

2
Grazie per questo, funziona alla grande ... A proposito, l'unico modo che ho trovato per ignorare sia * .txt che * .pdf era mettere quei modelli in un file e quindi usare l'opzione 'svn propset --file'
wytten

13

aggiungi al tuo file ~ / .subversion / config o / etc / subversion / config:

[miscellany]
global-ignores = build dist

Preferisco farlo per-repo se posso
Paul Tarjan

1
hmm non sono sicuro che ci sia un modo semplice per farlo per-repo, un hook pre-commit potrebbe rifiutare determinati modelli, ma non è una soluzione completa. svn: ignore su ogni directory genitore funziona, ma non in modo ricorsivo. potresti scambiare il tuo file di configurazione con uno script quando lavori su diversi repository, ma questo è un passaggio in più.
jspcal

1
Cosa significa build dist ?
IgorGanapolsky

9

È possibile ignorare le directory build e dist rimuovendo le directory dal controllo della versione. Il trucco è usare l'opzione --keep-local per lasciare la directory nella copia di lavoro. Per esempio:

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

La directory non sarà più tracciata da subversion ma sarà ancora lì nella tua copia di lavoro per contenere l'output del compilatore, ecc.

applausi, Joe


7

Ad esempio la struttura delle cartelle:

Project/
Project/dist/

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

È bene eseguire una cancellazione svn del contenuto dist prima del comando ignore, quindi per i rami dist sarà vuoto.

Ha funzionato per me, testato oggi. Ecco la pagina che lo spiega un po '


6

Per ignorare tutti questi file in tutti i repository, è possibile aggiungere un global-ignoresfile di configurazione per utente.

Su sistemi simili a Unix, quest'area appare come una directory denominata .subversion nella directory home dell'utente. Su sistemi Win32, Subversion crea una cartella denominata Subversion, tipicamente all'interno dell'area Dati applicazioni della directory del profilo dell'utente

Vedere Opzioni di configurazione

Sfortunatamente, non esiste un'opzione per repository per farlo. È fondamentalmente per utente o per directory, quindi il multiplo svn:ignoresè probabilmente la strada da percorrere, per quanto fastidioso può essere.


1
Preferisco farlo per-repo se posso
Paul Tarjan

Oh, allora sei sfortunato. Come dice @Kevin Reid, hai per directory o per utente.
Blair Conrad

6

Devi prima spostarti nella cartella superiore della tua copia di lavoro e creare un file lì (ad esempio .svnignore) dove dovresti posizionare tutti i modelli che desideri vengano ignorati, ad esempio (per un progetto Android):

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

Quindi esegui il seguente comando (ricorda che devi essere nella cartella superiore della tua copia di lavoro):

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

Funzionerà solo per cartelle e file che non sono ancora sotto il controllo della versione. Se desideri che anche una cartella (o un file) di cui viene eseguito il controllo delle versioni inizi a essere ignorata, rimuovilo dal controllo della versione eseguendo il comando:

svn rm --keep-local <path>

Ho preso tutto questo da questo fantastico articolo che spiega tutto: http://superchlorine.com/2013/08/getting-svn-to-ignore-files-and-directories/


Questo è stato immensamente utile. Questo è il modo migliore che ho trovato per ottenere un comportamento ignore simile a git in svn. Grazie mille.
Jonathan Wilson

6

In subversion 1.8, è possibile impostare global-ignores per il repository corrente.

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

Inoltre è possibile creare una cartella denominata .svnignore e scrivere le condizioni.

build
dist

ricorda una condizione per riga, l'impostazione build / * o dist / debug è vana. Quindi esegui il comando:

svn propset svn:global-ignores -F .svnignore .

funziona perfettamente! basta eseguire il primo comando sul repository appena estratto.
gaurav

3

Crea un file e aggiungi le tue ignorazioni al suo interno

Ingore-list:

file1 
directory1
file2
etc...

quindi applicare il seguente comando

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

directory è il nome della tua directory, puoi anche suddividere in categorie directory / sottodirectory. Oppure usa * per annotare la directory corrente in cui ti trovi.

Questo presuppone che tu stia usando bash come shell


Qual è il $ n qui?
IgorGanapolsky

1
@igor Ganapolsky - $ n è la variabile del ciclo for. Sarà impostato come indice per la sequenza in cui stai eseguendo il loop; in questo caso la directory specificata da "directory" nell'esempio precedente.
jncc99

3
svn propset --recursive svn:ignore svn_ignore_rules .

dove svn_ignore_rules è un file contenente le regole di ignoranza, una per riga

Ovviamente devi rieseguirlo ogni volta che aggiungi una nuova directory al tuo repository

svn_ignore_rules può anche essere considerato archiviato nel repository, per essere riutilizzabile da altri utenti che hanno accesso in scrittura al repository


2
cd parent_dir # la directory contenente la cartella da ignorare ricorsivamente
svn propedit svn: ignora. # aprirà svn-prop.tmp
arruola cartella / e
^ X
Y
commit -m 'ignora directory mirata'

mi ha aiutato, ho avuto problemi con l'impostazione del modello di cartella, SVN si stava complianando con quella cartella non nel repository set EDITOR=notepad, svn propedit svn:ignore .funzionava bene ...
Betlista

1

Poiché sembra che non ci sia soluzione per questo problema probabilmente comune, vorrei condividere la nostra soluzione. Come gli altri hanno già chiarito, puoi o utilizzare la svn:ignoreproprietà, questa vale per una singola directory (e quindi non per quelle nuove), oppure utilizzare quella global-ignoresche si applica a un singolo utente (ma non appartiene al repository).

Per rendere la vita un po 'più semplice ho creato un file reg denominato Settings.Svn.rege l'ho aggiunto alla radice del repository. Ora tutti possono fare doppio clic su questo file di registro una volta e hanno eseguito le impostazioni.

REGEDIT4

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

Apprezzerei davvero una soluzione all'interno del repository SVN, quindi se qualcuno lo sa, ti dispiacerebbe condividerla?


0

Un modo potrebbe essere quello di aggiungere una sorta di controllo all'hook pre o post commit, ma è una nota semplice se non si possiede il server repo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.