2010-07-14 22 views
5

Utilizzando Mercurial, ho bisogno di ignorare tutti i file e le directory eccetto directory "test" e "lingue" e file in quelle directory. Che tutto deve essere fatto con espressioni regolari e .hgignoereMercurial .hgignore espressione regolare

Files:

  • test \ rusco.txt
  • CMS \ test \ some_file.txt
  • cm \ lingue \ Users \ lang.txt
  • lingue \ lang2.txt
  • tests.txt
  • proba/tests.txt

ho provato con questo:

^(?!test|test/|test$|languages|languages/|languages$) 

ma questo corrisponde solo i file che inizia con test e lingua:

  • test \ rusco.txt
  • lingue \ lang2.txt

Quello che voglio è corrispondere anche

  • cm \ test \ some_file.txt
  • cm \ lingue \ Users \ lang.txt

Tutto il consiglio sarebbe apprezzato.

+0

Ho cambiato la mia risposta, e ora funzionerà. – Omnifarious

risposta

2

Utilizzare gocce, sono più semplici:

C:> dir 
tests languages pr0n espionage more_pr0n 

C:> type .hgignore 
syntax: glob 
pr0n/* 
espionage/* 
more_pr0n/* 

aggiunto: Se si teme che ci saranno nuove directory che non saranno ignorati allora si dovrebbe:

hg add .hgignore 
hg commit 
echo "new_directory/*" >> .hgignore 
hg commit 

Se nella directory di origine sono presenti troppe directory e file per far funzionare questo metodo, creare una directory di sola origine.

+0

Ho l'impressione che stia cercando un suggerimento che funzioni anche quando le nuove directory di livello superiore. –

+0

Anch'io ho avuto quell'impressione, nel qual caso la cura è stata aggiunta sopra. – msw

+0

Grazie per la risposta veloce. Ho provato a mettere questo nel mio .hgignore: sintassi: glob test/* lingue/* Ma questo è l'opposto di ciò che voglio raggiungere. Non voglio ignorare i file in quelle cartelle. Voglio ignorare tutti i file/cartelle che non sono membri di "test" e "lingue" – Danilo

2

Non è la risposta che si sta cercando, ma quasi nessuno usa la sintassi di larghezza negativa-?: nei propri file .hgignore. Nei casi in cui vogliono solo un piccolo sottoinsieme di tutti i file da non riconoscere, di solito ignorano tutto e quindi le eccezioni hg add - ricorda che in mercurial (a differenza di cvs/svn) l'aggiunta di un file ignora ignorare.

Così, se il .hgignore avresti:

.* 

e poi si sarebbe hg add i file contenuti nelle prove e lingue le directory in modo esplicito con 'hg add'. Ovviamente, devi ricordarti di aggiungere nuovi file mentre tutto va ignorato, ma se la maggior parte dei file dovrebbe essere ignorata, è ancora la strada più facile da percorrere.

+0

Spesso non è chiaro se la domanda debba essere risolta in base ai vincoli della domanda o se il problema di root debba essere risolto. Se quest'ultimo, questa risposta è corretta e completa ma non buona. – msw

+0

Grazie Ray4an per la risposta, ma questo è difficile da fare ogni volta. La mia idea è di ignorare tutti i file che non sono nelle prove e nelle lingue delle cartelle. Sai come posso fare questo? – Danilo

-1

Non è possibile.

Vedere le manpage.

Per esempio, dire che abbiamo un file non monitorate , file.c, a/b/file.c all'interno del nostro repository . Mercurial ignorerà file.c se qualche modello in .hgignore corrisponde a/b/file.c, a/b o a.

Quindi diciamo che si effettua un'espressione regolare che non corrisponderanno alcun percorso contenente test e il file proba/tests.txt è nella directory di lavoro. L'espressione regolare verrà prima applicata a proba e corrisponderà a quella in cui il file verrà ignorato.

+0

In realtà è possibile. Parte del motivo per cui ti sbagli è che è possibile ancorare le espressioni regolari in modo che corrispondano solo all'inizio del percorso. – Omnifarious

+0

Dovrai provarlo fornendo uno perché, per quanto posso immaginare, il tifo o meno non dovrebbe avere importanza. – hwiechers

+0

Mi dispiace, ho perso una parte importante della domanda. Hai ragione, non è possibile. – Omnifarious

0

chiave per risolvere questo è questa sezione dal hgignore man page:

Per esempio, dire che abbiamo un file non monitorate, file.c, a/b/file.c all'interno del nostro repository. Mercurial ignorerà file.c se qualsiasi modello in .hgignore corrisponde a/b/file.c, a/b o a.

Per ignorare tutto tranne un determinato set di directory, è necessario ignorare attentamente tutto a ogni livello della gerarchia dei file. Diciamo che vuoi ignorare tutto tranne uno/due/tre /, uno/due/quattro /, e foo /. In primo luogo, ignorare tutto ma uno/e foo /:

^(?!(one|foo)(/|$))

Il ^ e (/|$) ancoraggio one|foo nel percorso. Successivamente, ignorare tutto all'interno di uno/due che non è /:

^one/(?!(two)(/|$))

Le parentesi attorno two ci sono per coerenza e non sono necessari. E, infine, ignorare tutto in due/che non è di tre/quattro o /:

^one/two/(?!(three|four)(/|$))

Questo generalizza facilmente a qualsiasi insieme di directory.