Linux e SVN: come rimuovere tutti i file con versione tranne KEEP, ignorare le directory .svn?


9

Voglio rimuovere tutti i file con versione dal mio repository, ma MANTENERE la struttura delle directory con versione. Ovviamente voglio lasciare intatte tutte le directory .svn.

In altre parole, desidero svuotare completamente la struttura di directory di una copia di lavoro SENZA danneggiare la struttura di directory stessa.

Ad esempio, rimuovere i file da questa struttura:

dir/
    .svn/
        [files]
    svsubdir1/
        file1
        .svn/
            [files]
    subdir2/
        file2
        file3
        file4
        .svn/
            [files]
        subsubdir1/
            file5
            .svn/
                [files]

Dovrebbe comportare:

dir/
    .svn/
        [files]
    svsubdir1/
        .svn/
            [files]
    subdir2/
        .svn/
            [files]
        subsubdir1/
            .svn/
                [files]

Sto cercando una sorta di findcomando o qualcosa per realizzare questo, e ho difficoltà a costruire il comando. Grazie per l'aiuto!


Il motivo per cui lo sto facendo è che ho un'app Web che è stata sviluppata in "versioni" ma non è mai stata sotto controllo di revisione prima. Voglio metterlo ora sotto controllo di revisione SVN, e per facilità di riferimento storico, ecc., Sto cercando di replicare una progressione di quattro versioni da quattro diverse cartelle "backup" contenenti versioni progressivamente più vecchie. Una volta eliminati i file, posso copiare i file più recenti nella gerarchia per simulare la revisione più recente. Non sono sicuro se tutto ciò abbia un senso. :)
Brian Lacy,

1
Vale la pena notare che SVN dalla versione 1.7 (ottobre 2011) non ha più directory ".svn" multiple, ma solo una directory .svn al livello più alto. Vedi subversion.apache.org/docs/release-notes/1.7.html#wc-ng
Rich

Risposte:


10
find dir/ -path '*/.svn' -prune -o -type f -print

dovrebbe adattarsi al conto (per lo più viene dalla pagina di ricerca di -path). Pipa a meno e controlla. Ciò che fa prima è trovare (il percorso termina in .svn e non ricorrere in (potare) questa directory) o (se è un file, stamparlo).

Se sembra buono, cambiarlo in

find dir/ -path '*/.svn' -prune -o -type f -exec rm {} +

La versione + raggruppa tutti i file in un unico comando rm. Se sei paranoico, tieni prima un backup dell'albero ( cp -a dir/ otherdir/).


Soluzione perfetta, è esattamente quello di cui avevo bisogno! Grazie Derf!
Brian Lacy,

Al posto di '-exec rm {} +' puoi anche usare l'opzione '-delete' più intuitiva.
Tim Bielawa,

1
@Tim Secondo la manpage find, -deleteè approfondito e quindi in conflitto con il -prunefatto che i file all'interno della cartella verrebbero controllati prima dell'esame della cartella stessa. L'altra soluzione (usando -not -path ...invece di -path ... -pruneusare l'opzione -delete.
DerfK

Bella presa!
Tim Bielawa,

Ho usato questo trucco (o simili) numerose volte nel corso degli anni in una varietà di scenari. Quindi grazie ancora, @DerfK. :)
Brian Lacy,

2
trova . -not -path "* /. svn / *" -e -type f -and -exec / bin / rm '{}' \;

Dovrebbe fare il trucco.


Solo un consiglio, ma al posto -exec /bin/rm '{}'tuo puoi usare -delete.
Aaron Copley,
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.