Come faccio a ignorare una directory con SVN?


760

Ho appena iniziato a utilizzare SVN e ho una directory cache che non mi serve sotto il controllo del codice sorgente. Come posso ignorare l'intera directory / cartella con SVN?

Sto usando Versions e TextMate su OS X e riga di comando.


3
Domanda simile risposta qui [svn checkout ignorare cartella] [1] [1]: stackoverflow.com/questions/192824/svn-checkout-ignore-folder
mloskot

Possibile duplicato di Come ignoro i file in Subversion? (Non mi interessa troppo da che parte va il duplicato; nessuna delle due serie di risposte è ovviamente migliore dell'altra.)
Jeffrey Bosboom,

Risposte:


796

Imposta la svn:ignoreproprietà della directory principale:

svn propset svn:ignore dirname .

Se hai più cose da ignorare, separate da newline nel valore della proprietà. In tal caso è più semplice modificare il valore della proprietà utilizzando un editor esterno:

svn propedit svn:ignore .

2
@Kouber: il tuo problema è che l'espansione della shell non è a conoscenza delle proprietà svn: ignore. Quindi usando '*' come parametro explicityl passa tmp al comando commit. Prova qualcosa come "svn commit -m" Altri accenti ". '
MarkusSchaber,

4
Grazie per la risposta. Pico come editore: svn propedit svn: ignora. --editor-cmd pico
hade,

157
Nota: questo non funzionerà se la directory è già "in" svn. svn rm --keep-local dirnameprimo. (La mia uscita in formato svn stat è stata enorme e ci ho sbattuto la testa per un po '.)
Erik Aronesty

10
Se si desidera ignorare più di un file / cartella, aggiungere tutti i loro nomi a un file txt, una riga ciascuno e utilizzare la seguente variante:svn propset svn:ignore -F file.txt .
petervaz

2
Fai attenzione a come hai impostato svn:ignoree non svn::ignorecome ho fatto io. È possibile impostare proprietà arbitrarie, quindi quest'ultima verrà impostata su OK e sarà possibile visualizzare e modificare la proprietà, ma SVN non ignorerà i file elencati.
Richard Turner,

406

Ecco una struttura di directory di esempio:

\project
    \source
    \cache
    \other

Quando projectvedi che la tua directory della cache non viene aggiunta e si presenta come tale.

> svn st
M  source
?  cache

Per impostare la proprietà ignore, fare

svn propset svn: ignora la cache.

dove svn:ignoreè il nome della proprietà che stai impostando, cacheè il valore della proprietà ed .è la directory su cui stai impostando questa proprietà. Dovrebbe essere la directory padre della cachedirectory che necessita della proprietà.

Per verificare quali proprietà sono impostate:

> svn proplist
Properties on '.':
  svn:ignore

Per vedere il valore di svn:ignore:

> svn propget svn:ignore
cache

Per eliminare le proprietà precedentemente impostate:

svn propdel svn:ignore

17
Un punto difficile qui in cui mi sono imbattuto. Assicurati di non aggiungere una barra finale a dirname. Ad esempio, durante la digitazione svn propset svn:ignore dirname, se si consente alla shell (bash) di compilare il dirname per te, si aggiungerà quella barra finale, lasciandoti con il comando svn propset svn:ignore dirname/, che non comporta che la cartella venga ignorata. Almeno, questa è stata la mia esperienza.
David Weinraub,

4
La directory 'cache' verrà comunque elencata in 'svn st'. C'è un modo per rimuoverlo dalla vista? (senza eliminazione dal disco)
Tom Brito

131

Importante menzionare:

Sulla riga di comando non puoi usare

svn add *

Ciò aggiungerà anche i file ignorati, poiché la riga di comando si espande *e pertanto svn addritiene che si desideri aggiungere tutti i file. Quindi utilizzare questo invece:

svn add --force .

fai esattamente come ha detto @binco: svn add --force *NON funzionerà. Usa il punto, non la stella.
Manuell,

80

Dal momento che ho trascorso un po 'di tempo a cercare di farlo funzionare, si dovrebbe notare che se i file esistono già in SVN, è necessario per svn deleteloro, quindi modificare la svn:ignoreproprietà.

So che sembra ovvio, ma continuavano ad apparire come ?nella mia svn statuslista, quando pensavo che li avrebbe semplicemente ignorati localmente.


8
Non dimenticare di usare l'opzione --keep-local quando si eliminano i file se si desidera ignorarli e non eliminarli.
Dylan Holmes,

71

Per espanderlo leggermente, se lo stai facendo con lo strumento da riga di comando svn, devi digitare:

svn propedit svn:ignore path/to/dir

che aprirà il tuo editor di testo preferito, quindi digita '*' per ignorare tutto al suo interno e salva + esci - questo includerà la directory stessa in svn, ma ignora tutti i file al suo interno, per ignorare la directory, usa il percorso del padre e quindi digitare il nome della directory nel file. Dopo aver salvato, esegui un aggiornamento ('svn up'), quindi controlla il percorso appropriato.


8
Ottimo punto, grazie. Tutte le altre risposte hanno mancato il caso di directory nidificate. Quindi l'esempio sopra (funzionante) digiti nell'editor ignored_directory (che presuppone un livello sotto path / to / dir). Questo non funzionerà però: svn propedit svn: ignora. e quindi digitando path / to / dir / ignored_directory nell'editor. IOW: SVN abbina gli oggetti di un livello alla volta.
Greenoldman,

30

Impostare la svn:ignoreproprietà sulla directory principale:

$ cd parentdir
$ svn ps svn:ignore . 'cachedir'

Questo sovrascriverà qualsiasi valore corrente di svn:ignore. È possibile modificare il valore con:

$ svn pe svn:ignore .

Che aprirà il tuo editor. È possibile aggiungere più motivi, uno per riga.

È possibile visualizzare il valore corrente con:

$ svn pg svn:ignore .

Se stai usando una GUI dovrebbe esserci un'opzione di menu per farlo.


3
svn ps svn:ignore . 'cachedir'risultati in cachedir is not under version control. cambiando per svn ps svn:ignore 'cachedir' .lavorare per me
DiCaprio il

21

Grazie per tutti i contributi sopra. Vorrei solo condividere alcune informazioni aggiuntive dalle mie esperienze ignorando i file.


Quando le cartelle sono già sotto controllo di revisione

Dopo svn import e svn co i file, cosa facciamo di solito per la prima volta.

Tutta la cache di runtime, le cartelle degli allegati saranno sotto il controllo della versione. quindi, prima di svn ps svn: ignore , dobbiamo eliminarlo dal repository.

Con la versione 1.5 di SVN sopra possiamo usare svn del --keep-local your_folder, ma per una versione precedente, la mia soluzione è:

  1. svn esporta una copia pulita delle tue cartelle (senza .svncartella nascosta)
  2. svn del local and repository,
  3. svn ci
  4. Copia le cartelle
  5. Fare svn st e confermano le cartelle vengono contrassegnati come '?'
  6. Ora possiamo fare svn ps in base alle soluzioni

Quando abbiamo bisogno di più di una cartella da ignorare

  • In una directory ho due cartelle che devono essere impostate come svn:ignore
  • Se ne impostiamo uno, l'altro verrà rimosso.
  • Quindi ci chiediamo di aver bisogno di svn pe

svn pedovrai modificare il file di testo e puoi usare questo comando se richiesto per impostare il tuo editor di testo usando vi :

export SVN_EDITOR=vi
  1. Con "o" puoi aprire una nuova riga
  2. Digita tutti i nomi delle cartelle che desideri ignorare
  3. Premi il tasto 'esc' per uscire dalla modalità di modifica
  4. Digita ": wq" quindi premi Enterper salvare ed uscire

Il file ha un aspetto simile al seguente:

runtime
cache
attachments
assets

puoi anche usare svn propset svn:ignore -F .ignorethesefiles ., che utilizzerà il contenuto del file. Mi piace tenerlo in giro in modo da sapere cosa viene ignorato. Le modifiche richiedono un follow-up.
Gerard ONeill,

20

Rimuovilo prima ...

Se la tua directory fooè già sotto il controllo della versione, rimuovila prima con:

svn rm --keep-local foo

... quindi ignora:

svn propset svn:ignore foo .

12

... e se si desidera ignorare più di una directory (dire build/ temp/e *.tmpfile), è possibile farlo in due passaggi (ignorando la prima e modificando le proprietà ignora (vedere altre risposte qui) oppure si potrebbe scrivere qualcosa come

svn propset svn:ignore "build
temp
*.tmp" .

sulla riga di comando.


12

Se stai utilizzando il particolare client SVN TortoiseSVN , quindi su commit, hai la possibilità di fare clic con il tasto destro del mouse sugli elementi e selezionare "Aggiungi per ignorare l'elenco".


9

Il comando per ignorare più voci è un po 'complicato e richiede barre rovesciate.

svn propset svn:ignore "cache\
tmp\
null\
and_so_on" .

Questo comando ignorerà qualsiasi cosa di nome cache, tmp, null, e and_so_onnella directory corrente.


6
E solo per chiarire: la barra rovesciata qui non è una caratteristica di svn; è semplicemente un modo per inserire una stringa multilinea sulla shell. Puoi anche usare un editor e scrivere più righe.
sleske,

La barra rovesciata non è richiesta per bash. bash è abbastanza intelligente da sapere che un "è aperto e non per elaborare la linea. Tutto quello che devi fare è premere Invio dopo cache, tmp e null. Vedrai che bash cambia il prompt in> in modo da conoscerti stanno ancora inserendo il comando. Un'alternativa è iniziare a digitare il comando (svn), quindi premere esc quindi v. Ciò consentirà di immettere il comando nell'editor. Al termine premere ZZ per eseguire il comando. Se si cambia idea e non voglio eseguire, quindi: q !.
Michael Potter,

1
svn propset svn:ignore -F .ignorethesefiles .ti permetterà di usare un file. E come detto, hai sempre propedit.
Gerard ONeill,

5

Ho avuto problemi a far ignorare le directory nidificate; la directory principale che volevo ignorare non sarebbe mostrata con 'svn status' ma tutti i sottodir lo facevano. Questo è probabilmente evidente a tutti gli altri, ma ho pensato di condividerlo:

ESEMPIO:

/tronco

/ Trunk / cache

/ Trunk / cache / subdir1

/ Trunk / cache / subdir2

cd /trunk
svn ps svn:ignore . /cache
cd /trunk/cache
svn ps svn:ignore . *
svn ci

4

"Grazie" svn per un modo così orribile, fasullo e difficile di ignorare i file.

Quindi ho scritto uno script svn-ignore-all :

#!/bin/sh

# svn-ignore-all

# usage: 
#   1. run svn status to see what is going on at each step 
#   2. add or commit all files that you DO want to have in svn
#   3. remove any random files that you don't want to svn:ignore
#   4. run this script to svn:ignore everything marked '?' in output of `svn status`

svn status |
grep '^?' |
sed 's/^? *//' |
while read f; do
    d=`dirname "$f"`
    b=`basename "$f"`
    ignore=`svn propget svn:ignore "$d"`
    if [ -n "$ignore" ]; then
        ignore="$ignore
"
    fi
    ignore="$ignore$b"
    svn propset svn:ignore "$ignore" "$d"
done

Inoltre, per ignorare un elenco specifico di file / percorsi, possiamo usare questa variante svn-ignore . Immagino che svn-ignore-all dovrebbe davvero essere come xargs svn-ignore.

#!/bin/sh

# svn-ignore

# usage:
#   svn-ignore file/to/ignore ...

for f; do
    d=`dirname "$f"`
    b=`basename "$f"`
    ignore=`svn propget svn:ignore "$d"`
    if [ -n "$ignore" ]; then
        ignore="$ignore
"
    fi
    ignore="$ignore$b"
    svn propset svn:ignore "$ignore" "$d"
done

Ancora una cosa: tendo a inquinare i miei checkout svn con molti file casuali. Quando è il momento di eseguire il commit, sposto quei file in una sottodirectory "vecchia" e dico a svn di ignorare "vecchia".


Ehi Sam, è una bella sceneggiatura. Mi è venuta in mente una domanda: forse il problema deriva dal fatto che ignorare un'intera cartella che fa parte del repository non funziona, quindi finiamo con quelli "?" file che sono sostanzialmente file modificati in cartelle che abbiamo aggiunto all'elenco ignora? Mi chiedo solo se c'è un modo per aggirare la tua sceneggiatura, dato che sarebbe noioso eseguirla continuamente. Fai?
SquareCat,

no, non lo uso davvero! prova a ripulire i miei file
Sam Watkins,

4

Bash oneliner per più ignori:

svn propset svn:ignore ".project"$'\n'".settings"$'\n'".buildpath" "yourpath"

3

Se la directory del progetto è denominata / Progetto e la directory della cache è denominata / Progetto / Cache, è necessario impostare una proprietà di sovversione su / Progetto. Il nome della proprietà dovrebbe essere "svn: ignore" e il valore della proprietà dovrebbe essere "Cache".

Fare riferimento a questa pagina nel manuale di Subversion per ulteriori informazioni sulle proprietà.


3

La risposta di Jason farà il trucco. Tuttavia, invece di impostare svn: ignora su "." nella directory della cache, potresti voler includere "cache" nella proprietà svn: ignore della directory principale , nel caso in cui la directory della cache non sia sempre presente. Lo faccio su un numero di cartelle "usa e getta".


3

PER MANTENERE LE DIRETTIVE CHE SVN NON IGNORA:

  1. questo eliminerà i file dal repository, ma manterrà la directory sotto il controllo SVN:

svn delete --keep-local path / directory_to_keep / *

  1. quindi imposta per ignorare la directory (e tutto il contenuto):

svn propset svn: ignora il percorso "*" / directory_to_keep


2

Se stai usando un frontend per SVN come TortoiseSVN, o una sorta di integrazione IDE, dovrebbe esserci anche un'opzione ignora nello stesso menu dell'operazione commit / add.


1

Imposta la proprietà svn: ignore . La maggior parte degli strumenti svn dell'interfaccia utente ha un modo per farlo e la discussione sulla riga di comando nel collegamento.


1

Dal momento che stai usando Versioni è davvero molto semplice:

  • Sfoglia la tua copia ritirata
  • Fai clic sulla directory da ignorare
  • Nella casella "Ignora a destra fai clic su Modifica
  • Digita *. * Per ignorare tutti i file (o * .jpg solo per i file jpg, ecc.)

1

Guarda anche le tue barre finali. Ho scoperto che includendo images/*nel mio file di impostazione ignora non ho ignorato ./images/. Quando ho corso svn status -uha mostrato ancora ? images. Quindi, ho appena cambiato l'impostazione ignore in just images, no slash. Ho eseguito un controllo dello stato e questo è stato cancellato.


1

Risolto con Eclipse nel modo seguente:

Prima di tutto, esegui una sincronizzazione della tua cartella con il progetto:

squadra -> sincronizza

Nella vista successiva, vista squadra, puoi vedere tutte le risorse che puoi impegnare sul server SVN.

Quindi, selezionare la cartella delle risorse della risorsa che si desidera ignorare e quindi è possibile ignorarla utilizzando

squadra -> aggiungi a svn:ignore.

Successivamente, nella finestra di conferma, seleziona la prima opzione: "ignora per nome".

Ad esempio, se voglio ignorare la cartella di destinazione e le relative risorse .class, eseguirò la sincronizzazione e, nella vista di sincronizzazione, selezionerò la cartella di destinazione. Successivamente, selezionerò

SQUADRA-> add

a svn:ignoree quindi confermo la prima opzione nella finestra di conferma.


0

Dopo aver perso molto tempo a cercare come fare questa semplice attività, ho deciso di postare non è stato difficile trovare una spiegazione decente.

Prima di tutto lascia che la struttura del campione

$ svn st? progetto / tronco / target? proiettare / trunk / myfile.x

1 - prima configura l'editor, in mycase vim export SVN_EDITOR = vim

2 - "svn propedit svn: ignora project / trunk /" aprirà un nuovo file e puoi aggiungere i tuoi file e la sottodirectory in noi caso tipo "target" salvare e chiudere il file e funziona

$ svn st? proiettare / trunk / myfile.x

Grazie.

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.