Come ignoro i file in Subversion?
Inoltre, come faccio a trovare i file che non sono sotto controllo di versione?
(Questa risposta è stata aggiornata per corrispondere al comportamento di SVN 1.8 e 1.9)
Hai 2 domande:
Con "file ignorato" intendo che il file non verrà visualizzato negli elenchi anche come "non verificato": il tuo client SVN farà finta che il file non esista affatto nel filesystem.
I file ignorati sono specificati da un "modello di file". La sintassi e il formato dei modelli di file sono spiegati nella documentazione online di SVN: http://svnbook.red-bean.com/nightly/en/svn.advanced.props.special.ignore.html "Pattern di file in Subversion ".
Subversion, dalla versione 1.8 (giugno 2013) e successive, supporta 3 diversi modi di specificare i pattern dei file. Ecco un riassunto con esempi:
global-ignores
:global-ignores
non sarà condiviso da altri utenti e si applica a tutti i repos che effettui il checkout sul tuo computer.C:\Users\{you}\AppData\Roaming\Subversion\config
Software\Tigris.org\Subversion\Config\Miscellany\global-ignores
in HKLM
e HKCU
.~/.Subversion/config
svn:ignore
, che è impostata sulle directory (non sui file):.gitignore
.svn:ignore
è applicato alle directory ed è non ricorsivo o ereditato. Tutti i file o immediate sottodirectory della directory superiore che corrisponde al Pattern File saranno esclusi.Mentre SVN 1.8 aggiunge il concetto di "proprietà ereditate", la proprietà svn:ignore
stessa viene ignorata nelle directory discendenti non immediate:
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
(Quindi il file ./subdirectory/ignoreThis
non viene ignorato, anche se "ignoreThis.txt
" viene applicato alla radice del repository .
).
Pertanto, per applicare ricorsivamente un elenco di ignori è necessario utilizzare svn propset svn:ignore <filePattern> . --recursive
.
<filePattern>
è diverso in una directory figlio, il valore del figlio sovrascrive completamente i genitori, quindi non vi è alcun effetto "additivo".<filePattern>
nella root .
, dovrai cambiarlo con --recursive
per sovrascriverlo sulle directory figlio e discendente.Prendo atto che la sintassi della riga di comando è contro-intuitiva.
svn ignore pathToFileToIgnore.txt
ma non è così che funziona la funzione ignora di SVN.svn:global-ignores
. Richiede SVN 1.8 (giugno 2013):svn:ignore
, eccetto che fa uso della funzione "Proprietà ereditate" di SVN 1.8.svn:ignore
, il pattern del file viene applicato automaticamente in ogni directory discendente (non solo i bambini immediati) .svn:global-ignores
con il flag --recursive
, poiché i modelli di file ignorati ereditati vengono applicati automaticamente non appena vengono ereditati.Eseguendo lo stesso insieme di comandi come nell'esempio precedente, ma utilizzando svn:global-ignores
invece:
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!
L'intero arrangiamento è stato per me fonte di confusione, perché la terminologia di TortoiseSVN (usata nel loro sistema di menu di Windows Explorer) inizialmente mi era fuorviante: non ero sicuro di quale fosse il significato del menu Ignora "Aggiungi ricorsivamente", "Aggiungi *" e "Aggiungi" opzioni. Spero che questo post spieghi come la caratteristica Ignore si collega alla funzione Proprietà SVN. Detto questo, suggerisco di usare la riga di comando per impostare i file ignorati in modo da avere un'idea di come funziona invece di usare la GUI, e solo usando la GUI per manipolare le proprietà dopo che sei a tuo agio con la riga di comando.
Il comando svn status
nasconderà i file ignorati (ovvero i file che corrispondono a un pattern R__zglobal-ignores
, o corrispondono a un pattern svn:ignore
della directory madre immediata o corrispondano a uno schema svn:global-ignores
di qualsiasi directory di ancesor.
Utilizzare l'opzione --no-ignore
per vedere quei file elencati. I file ignorati hanno lo stato di I
, quindi reindirizzano l'output a grep
per mostrare solo le righe che iniziano con "I".
Il comando è:
svn status --no-ignore | grep "^I"
Per esempio:
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!
Utilizzare il seguente comando per creare un elenco non in file di controllo della versione.
svn status | grep "^\?" | awk "{print \$2}" > ignoring.txt
Quindi modifica il file in lascia solo i file che vuoi effettivamente ignorare . Quindi utilizzare questo per ignorare i file elencati nel file:
svn propset svn:ignore -F ignoring.txt .
Nota il punto alla fine della linea. Indica a SVN che la proprietà viene impostata sulla directory corrente.
Elimina il file:
rm ignoring.txt
Finalmente impegnarsi,
svn ci --message "ignoring some files"
È quindi possibile verificare quali file vengono ignorati tramite:
svn proplist -v
Se si utilizza TortoiseSVN , fare clic con il tasto destro del mouse su un file e quindi selezionare TortoiseSVN/Aggiungi per ignorare l'elenco. Questo aggiungerà il file/carattere jolly alla proprietà svn:ignore
.
svn:ignore
verrà controllato durante il check-in dei file e i file corrispondenti saranno ignorati. Ho il seguente elenco di ignorare per un progetto di Visual Studio. NET:
bin obj
*.exe
*.dll
_ReSharper
*.pdb
*.suo
Puoi trovare questo elenco nel menu di scelta rapida su TortoiseSVN/Proprietà.
Puoi ignorare un file o una directory come .gitignore. Basta creare un file di testo con l'elenco delle directory/file che si desidera ignorare ed eseguire il seguente codice:
svn propset svn:ignore -F ignorelist.txt .
O se non vuoi usare un file di testo, puoi farlo in questo modo:
svn propset svn:ignore "first
second
third" .
Fonte: Blog di Karsten - Imposta svn: ignora per più file dalla riga di comando
Ho trovato l'articolo .svnignore Example for Java.
Esempio: .svnignore per Ruby on Rails,
/log
/public/*.JPEG
/public/*.jpeg
/public/*.png
/public/*.gif
*.*~
Dopodiché:
svn propset svn:ignore -F .svnignore .
Esempi per .gitignore. Puoi usare per il tuo .svnignore
Come nessuno sembra averlo menzionato ...
svn propedit svn:ignore .
Quindi modifica il contenuto del file per specificare i pattern da ignorare, esci dall'editor e hai finito.
Quando usi propedit assicurati di non avere spazi finali in quanto ciò causerà l'esclusione del file dall'elenco ignorato.
Questi vengono inseriti automaticamente se si utilizza la funzione di completamento automatico della scheda su linux per creare il file con cui iniziare:
svn propset svn:ignore 'file1
file2' .
Un'altra soluzione è:
svn st | awk '/^?/{print $2}' > svnignore.txt && svn propget svn:ignore >> svnignore.txt && svn propset svn:ignore -F svnignore.txt . && rm svnignore.txt
o linea per linea
svn st | awk '/^?/{print $2}' > svnignore.txt
svn propget svn:ignore >> svnignore.txt
svn propset svn:ignore -F svnignore.txt .
rm svnignore.txt
Cosa fa:
Inoltre, se usi SVN Tortoise puoi farlo:
Una versione più leggibile di bkbilly's answer:
svn st | awk '/^?/{print $2}' > svnignore.txt
svn propget svn:ignore >> svnignore.txt
svn propset svn:ignore -F svnignore.txt .
rm svnignore.txt
Cosa fa:
SVN ignore
è facile da gestire in TortoiseSVN. Apri TortoiseSVN e fai clic con il pulsante destro del mouse sul menu file, quindi seleziona Aggiungi per ignorare l'elenco.
Questo aggiungerà i file nella proprietà svn:ignore
Quando verificheremo i file, allora quei file che sono abbinati a svn:ignore
che saranno ignorati e non impegneranno.
Nel progetto Visual Studio abbiamo aggiunto i seguenti file da ignorare:
bin obj
*.exe
*.dll
*.pdb
*.suo
Stiamo gestendo il codice sorgente su SVN di Comparetrap utilizzando questo metodo con successo
È inoltre possibile impostare un pattern di ignoranza globale nel file di configurazione di SVN.
Aggiungere una directory a Subversion e ignorare il contenuto della directory
svn propset svn:ignore '\*.*' .
o
svn propset svn:ignore '*' .
Usa il comando svn status sulla tua copia di lavoro per mostrare lo stato dei file, i file che non sono ancora sotto controllo di versione (e non ignorati) avranno un punto interrogativo accanto a loro.
Per quanto riguarda l'ignoranza dei file, è necessario modificare la proprietà svn: ignore, leggere il capitolo Ignorare articoli non analizzati nello svnbook all'indirizzo http://svnbook.red-bean.com/en/1.5/svn.advanced.props.special. ignore.html . Il libro descrive inoltre ulteriori informazioni sull'uso dello stato di svn.