Come faccio a ignorare i file in Subversion?


645

Come faccio a ignorare i file in Subversion?

Inoltre, come posso trovare file che non sono sotto il controllo della versione?


È divertente vedere come ogni semplice domanda (probabilmente di un utente git) significhi molte risposte complicate. Se questo accade, questo è Subversion baby.
Valerio Bozz,

Risposte:


738

(Questa risposta è stata aggiornata per corrispondere al comportamento di SVN 1.8 e 1.9)

Hai 2 domande:

Contrassegnare i file come ignorati:

Per "file ignorato" intendo che il file non apparirà 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 pattern 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 modi diversi di specificare i modelli di file. Ecco un riepilogo con esempi:

1 - Area di configurazione runtime - global-ignoresopzione:

  • Questa è un'impostazione solo sul lato client , quindi la tuaglobal-ignores elenco non sarà condiviso da altri utenti e si applica a tutti i repository che fai il checkout sul tuo computer.
  • Questa impostazione è definita nel file Runtime Configuration Area:
    • Windows (basato su file) - C:\Users\{you}\AppData\Roaming\Subversion\config
    • Windows (basato su registro) - Software\Tigris.org\Subversion\Config\Miscellany\global-ignoresin entrambi HKLMe HKCU.
    • Linux / Unix - ~/.subversion/config

2 - La svn:ignoreproprietà, che è impostata su directory (non file):

  • Questo è archiviato all'interno del repository, quindi altri utenti avranno gli stessi file ignorati. Simile a come .gitignorefunziona.
  • svn:ignoreviene applicato alle directory ed è non ricorsivo o ereditato. Qualsiasi file o sottodirectory immediata della directory principale che corrisponde al modello di file verrà escluso.
  • Mentre SVN 1.8 aggiunge il concetto di "proprietà ereditate", la svn:ignoreproprietà 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/ignoreThisnon 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.

    • Questo creerà una copia della proprietà su ogni sottodirectory.
    • Se il <filePattern>valore è diverso in una directory figlio, il valore del bambino sovrascrive completamente i genitori, quindi non vi è alcun effetto "additivo".
    • Pertanto, se si modifica il <filePattern>root ., è necessario modificarlo con --recursiveper sovrascriverlo nelle directory figlio e discendente.
  • Noto che la sintassi della riga di comando è controintuitiva.

    • Ho iniziato supponendo che tu ignorassi un file in SVN digitando qualcosa del genere, svn ignore pathToFileToIgnore.txttuttavia non è così che funziona la funzione Ignora di SVN.

3- La svn:global-ignoresproprietà. Richiede SVN 1.8 (giugno 2013):

  • Questo è simile svn:ignore, tranne per il fatto che utilizza la funzione "proprietà ereditate" di SVN 1.8.
  • Confronta con svn:ignore, il modello di file viene applicato automaticamente in ogni directory discendente (non solo dei figli immediati).
    • Ciò significa che non è necessario impostarlo svn:global-ignorescon il --recursiveflag, poiché i modelli di file ignorati ereditati vengono automaticamente applicati man mano che vengono ereditati.
  • Eseguendo lo stesso set di comandi dell'esempio precedente, ma usando svn:global-ignoresinvece:

    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!
    

Per gli utenti di TortoiseSVN:

L'intero accordo è stato confuso per me, perché la terminologia di TortoiseSVN (come utilizzata nel loro sistema di menu di Windows Explorer) inizialmente mi è stata fuorviante - non ero sicuro del significato del "Aggiungi ricorsivamente", "Aggiungi *" e "Aggiungi" del menu Ignora opzioni. Spero che questo post spieghi come la funzione Ignora si collega alla funzione Proprietà SVN. Detto questo, ti suggerisco di utilizzare la riga di comando per impostare i file ignorati in modo da farti un'idea di come funziona invece di utilizzare la GUI e di utilizzare la GUI solo per manipolare le proprietà dopo che ti senti a tuo agio con la riga di comando.

Elenco dei file che vengono ignorati:

Il comando svn statusnasconde i file ignorati (ovvero i file che corrispondono a un global-ignoresmodello RGA o corrispondono a un svn:ignoremodello di directory padre immediato o corrispondono a un modello di directory di un antenato svn:global-ignores.

Utilizzare l' --no-ignoreopzione per visualizzare i file elencati. I file ignorati hanno uno stato di I, quindi reindirizzare l'output a grepmostrare 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!


6
Per trovare i file ignorati: svn status -u -v --no-ignore | grep "^ I" | awk "{print \ $ 2}"
Christian Madsen

3
se vuoi ignorare il file ./FolderA/FolderB/FileToIgnore, fallo dal tuo. cartella: svn propset svn: ignora "FileToIgnore" Cartella A / CartellaB /
jnj

8
se stai scrivendo svn propedit svn:ignore .e nessun editor di testo è configurato, riceverai un messaggio di errore che dice svn: E205007: nessuna delle variabili d'ambiente SVN_EDITOR, VISUAL o EDITOR è impostata e nessuna opzione di configurazione di runtime 'editor-cmd' era trovato invece di aprire un editor. Quindi basta specificare --editor-cmd nano in questo modosvn propedit svn:ignore . --editor-cmd nano
Jonathan Morales Vélez

12
Puoi anche ignorare i file con un nome file specifico in tutte le sottocartelle usando l'argomento "--recursive". cioè svn propset svn: ignora "* .jpg".
Templare

2
Un'alternativa più semplice a awk è grep:svn status | grep '^?'
Johnride,

91

Utilizzare il comando seguente per creare un elenco non in file di controllo versione.

svn status | grep "^\?" | awk "{print \$2}" > ignoring.txt

Quindi modifica il file per lasciare solo i file che desideri 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 riga. Indica a SVN che la proprietà è impostata sulla directory corrente.

Elimina il file:

rm ignoring.txt

Finalmente impegno,

svn ci --message "ignoring some files"

È quindi possibile verificare quali file vengono ignorati tramite:

svn proplist -v

2
Bello. Un piccolo miglioramento è svn status | awk "/^?/ {print \$2}" > ignoring.txt.
Dirk Eddelbuettel,

4
perché eliminare il file? tienilo nel repository se
devi

Nota che questa soluzione non ignorerà i file nelle sottodirectory (anche se si presentano in ignoring.txt).
Shaneb,

Ciò manterrebbe gli ignoranti esistenti? In caso contrario, come eseguirlo in un comando (ovvero --no-ignora e mantiene anche le righe precedute da I)?
a1an

Questo sovrascriverebbe i tuoi attuali ignorati, prova: svn pg svn:ignore . >> ignore.txtdopo il primo comando per aggiungere gli attuali ignorati al file.
ulitosCoder

55

.gitignore come approccio

Puoi ignorare un file o una directory come .gitignore. Basta creare un file di testo con un elenco di directory / file che si desidera ignorare ed eseguire il codice seguente:

svn propset svn:ignore -F ignorelist.txt .

OPPURE se non si desidera utilizzare un file di testo, è possibile 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


1
Nota che se successivamente modifichi il tuo file ignore, devi eseguire nuovamente il svn:ignorecomando (vedi stackoverflow.com/a/58380306/189518 )
Sensei James,

50

Se si utilizza TortoiseSVN , fare clic con il pulsante destro del mouse su un file e quindi selezionare TortoiseSVN / Aggiungi per ignorare l'elenco . Ciò aggiungerà il file / carattere jolly al filesvn:ignore proprietà.

svn:ignoreverrà verificato quando si esegue il check-in dei file e i file corrispondenti verranno ignorati. Ho il seguente elenco di ignorare per un progetto Visual Studio .NET:

bin obj
*.exe
*.dll
_ReSharper
*.pdb
*.suo

Puoi trovare questo elenco nel menu contestuale su TortoiseSVN / Proprietà .


27

Come nessuno sembra averlo menzionato ...

svn propedit svn:ignore .

Quindi modifica il contenuto del file per specificare i motivi da ignorare, esci dall'editor e il gioco è fatto.


3
Questa risposta è stata utile. Nel mio caso ho dovuto cambiare "." nella sottodirectory del file che volevo ignorare e basta specificare il modello di file. Inoltre, la prima volta, dovevo eseguire questo (sono su Mac): export SVN_EDITOR = "nano"
Elija Lofgren

22

Ho trovato l'articolo .svnignore Esempio per 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 usarlo per il tuo .svnignore

https://github.com/github/gitignore


1
ho fatto come hai detto ... ma quando eseguo lo stato svn. mostra ancora i file ignorati con "?"
Harshit Gupta,

Non ho mai verificato lo stato svn, ma con svn add * e dopo svn commit, ignorare i file non è commit.
d.danailov,

se un file "a.txt" è già nel controllo versione, quindi il comando ignore viene eseguito come "svn propset svn: ignore -F .svnignore a.txt"? è corretto ?
Errakeshpd,

Se aggiungi "a.txt" nel tuo file .svnignore, non ne sono sicuro, ma il comando dovrebbe essere corretto.
d.danailov,

10

Quando si utilizza propedit assicurarsi di non avere spazi finali in quanto ciò causerà l'esclusione del file dall'elenco ignora.

Questi vengono inseriti automaticamente se hai usato tab-autocomplete su Linux per creare il file per iniziare:

svn propset svn:ignore 'file1
file2' .

6
Funziona solo con alcune shell, come bash. Si noti che la riemissione del comando propset sovrascrive il set di schemi precedente.
JA Faucett,

Quindi file1 e file2 devono essere su linee separate?
IgorGanapolsky,

8

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 riga per riga

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:

  1. Ottiene i file di stato da svn
  2. Salva tutti i file con ?al file "svnignore.txt"
  3. Ottiene i file già ignorati e li aggiunge al file "svnignore.txt"
  4. Indica a svn di ignorare i file in "svnignore.txt"
  5. Rimuove il file

8

Inoltre, se usi Tortoise SVN puoi farlo:

  1. Nel menu contestuale selezionare "TortoiseSVN", quindi "Proprietà"
  2. Nella finestra visualizzata fai clic su "Nuovo", quindi su "Avanzate"
  3. Nella finestra visualizzata accanto a "Nome proprietà" selezionare o digitare "svn: ignore", opposto a "Valore proprietà" digitare il nome file desiderato o il nome della cartella o la maschera file (nel mio caso era "* / target"), fare clic su "Applica proprietà ricorsivamente "
  4. Ok. Ok.
  5. Commettere

6
  1. cd ~ / .subversion
  2. configurazione aperta
  3. trova la linea come 'global-ignora'
  4. set ignora il tipo di file in questo modo: global-ignores = * .o * .lo * .la * .al .libs * .so .so. [0-9] * .pyc * .pyo 88 * .rej ~ # #. # *. *. swp .DS_Store output node_modules

Grazie, la tua risposta è l'unica che menziona il configfile.
Henrique de Sousa,

Questa risposta menziona pure @HenriquedeSousa stackoverflow.com/a/86052/7724 e spiega anche che si tratta di un modo solo client locale di ignorare i file.
bzlm,

5

Una versione più leggibile della risposta di bkbilly:

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:

  1. Ottiene i file di stato da svn
  2. Salva tutti i file con ? al file "svnignore.txt"
  3. Ottiene i file già ignorati e li aggiunge al file "svnignore.txt"
  4. Indica a svn di ignorare i file in "svnignore.txt"
  5. Rimuove il file

Mi piace la risposta di bkbilly, ma questa versione interrompe ogni riga per renderla più leggibile e rimuove il && che nei miei test non ha fatto nulla, dal momento che la prima riga crea sempre il file temporaneo e questo stesso file temporaneo viene sempre nell'elenco ignorato.
LivingDust

Una proposta di modifica sarebbe più appropriata in questo caso. Apprezzo lo sforzo!
Jim,

Non avevo ancora abbastanza reputazione per suggerire una modifica. ma non voglio rovinare un buon protocollo. Esiste un semplice README sulle linee guida per quando è meglio suggerire e modificare piuttosto che pubblicare una nuova risposta, ecc.?
LivingDust

1
Se la tua risposta è esattamente la stessa di quella pubblicata un anno e mezzo fa, è piuttosto semplice. Hai anche copiato la spiegazione " Cosa fa ".
Jim,

3

Puoi anche impostare un modello globale di ignore nel file di configurazione di SVN.


1
È possibile impostare un modello ignore per un repository specifico?
David Doria,

3

svn status ti dirà quali file non sono in SVN, così come cosa è cambiato.

Guarda le proprietà SVN per la proprietà ignore.

Per tutte le cose SVN, è necessario leggere il libro rosso .



2

Utilizzare 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'ignoramento dei file, è necessario modificare la proprietà svn: ignore, leggere il capitolo Ignorare gli oggetti non visti nello svnbook su http://svnbook.red-bean.com/en/1.5/svn.advanced.props.special.ignore. html . Il libro descrive anche di più sull'uso dello stato svn.


2

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.

Ciò aggiungerà i file nella svn:ignoreproprietà. Quando eseguiamo il check-in dei file, i file corrispondenti svn:ignoreverranno ignorati e non verranno sottoposti a commit.

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 usando questo metodo con successo


2

Cosa ha funzionato per me:

Come faccio a ignorare i file in Subversion?
1.In Esplora file, fare clic con il tasto destro del mouse sul nome-cartella del progetto SVN
2.Fare clic su "SVN Commit ..."
3. Apparirà una finestra "commit"
4. Fare clic con il tasto destro del mouse sulla cartella / file che si desidera ignorare
5.Fare clic su Aggiungi per ignorare l'elenco
6.Selezionare la cartella / file
7.Commettere la "modifica della proprietà" su SVN

Inoltre, come posso trovare file che non sono sotto il controllo della versione?
Dopo il passaggio 3 sopra, fai clic su "Mostra file non visti"


0
  1. apri usi il prodotto JetBrains (ad esempio Pycharm)
  2. quindi fai clic sul pulsante "commit" nella barra degli strumenti in alto o usa la scorciatoia "ctrl + k" screenshot_toolbar
  3. sull'interfaccia di commit, spostare i file indesiderati in un altro elenco di modifiche come segue. screenshot_commit_change
  4. la prossima volta è possibile eseguire il commit solo dell'elenco di modifiche predefinito.
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.