Come posso eliminare tutti i file / cartelle non esaminati / ignorati nella mia copia di lavoro?


136

Se ho una copia funzionante di un repository Subversion, c'è un modo per eliminare tutti i file non esaminati o ignorati in quella copia funzionante con un singolo comando o strumento? In sostanza, sto cercando l'analogo SVN agit clean .

Sarebbe accettabile una riga di comando o una soluzione GUI (per TortoiseSVN).


Risposte:


98

Utilizzando TortoiseSVN:


7
Bella caratteristica! Ho dovuto leggere il collegamento, tuttavia, per scoprire che funziona solo sulla vista elenco (non sulla vista ad albero) su XP - forse dovresti includerlo nella tua risposta.
Nick Meyer,

5
La versione della riga di comando di svn (in particolare su Windows) non fornisce la stessa funzione?
blong,

3
Come sombody indicato di seguito:svn cleanup --remove-unversioned --remove-ignored .
haui

133
svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf "$f"; done

Questo ha le seguenti caratteristiche:

  • I file ignorati e non tracciati vengono eliminati
  • Funziona anche se il nome di un file contiene spazi bianchi (ad eccezione di newline, ma non c'è molto che si possa fare al di fuori di usare il --xml opzione e analizzare l'output XML risultante)
  • Funziona anche se svn status stampa altri caratteri di stato prima del nome del file (cosa che non dovrebbe perché i file non vengono tracciati, ma nel caso ...)
  • Dovrebbe funzionare su qualsiasi sistema conforme a POSIX

Uso uno script di shell chiamato svncleanche contiene quanto segue:

#!/bin/sh

# make sure this script exits with a non-zero return value if the
# current directory is not in a svn working directory
svn info >/dev/null || exit 1

svn status --no-ignore | grep '^[I?]' | cut -c 9- |
# setting IFS to the empty string ensures that any leading or
# trailing whitespace is not trimmed from the filename
while IFS= read -r f; do
    # tell the user which file is being deleted.  use printf
    # instead of echo because different implementations of echo do
    # different things if the arguments begin with hyphens or
    # contain backslashes; the behavior of printf is consistent
    printf '%s\n' "Deleting ${f}..."
    # if rm -rf can't delete the file, something is wrong so bail
    rm -rf "${f}" || exit 1
done

2
Esattamente quello che stavo cercando, funziona come un incantesimo anche su Linux e MacOS!
ricco

Devi ripristinare l'IFS? Ho scelto di non creare uno script "svnclean". quindi mi chiedo se questo
rovinerà

3
@matrixugly: No, non è necessario IFStornare a quello che era prima. Quando lo fai VARNAME=value command, l'assegnazione di valueto VARNAMEsi applica solo durante l'esecuzione di command(con alcune eccezioni che non si applicano a read). Vedere le specifiche POSIX e questa segnalazione bug POSIX per maggiori dettagli.
Richard Hansen,

@rich, grazie per averlo condiviso. È venuto alla ricerca di una soluzione di pulizia svn qualche anno fa, e anche se ne andò con alcune conoscenze di scripting shell! Evidentemente sono tornato a questa risposta parecchio.
C. Tewalt,

120

So che questo è vecchio ma nel caso in cui qualcun altro si imbatti in esso, versioni più recenti (1.9 o successive) del supporto svn --remove-unversioned, ad es svn cleanup . --remove-unversioned.

https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options


18
Per me questa è la risposta giusta. È una risposta da riga di comando multipiattaforma. Inoltre, puoi rimuovere i file ignorati consvn cleanup . --remove-ignored
Dan Atkinson,

1
Funziona in svn 1.6 e versioni successive.
Wegry,

2
Per favore cambialo in 1.9, vedi anche subversion.apache.org/docs/release-notes/1.9.html (ho provato localmente e non ha funzionato, e sono 1.8.8)
ikku100,

2
Sembra che il problema sia che non rimuove le cartelle senzaversioni .
Nyerguds,

1
@Nyerguds: Vero, questo non elimina le cartelle senza versione, ma solo i file senza versione. Qualcuno ha trovato una soluzione?
dhiraj suvarna,

42

Questo oneliner potrebbe aiutarti:

$ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf

Usare con cura!


13
questo non rimuove i file ignorati e si romperà se un nome file contiene spazi bianchi
Richard Hansen

1
Inoltre, non elimina i file ignorati
plaisthos,

4
Puoi usare svn status --no-ignoreper catturare bene i file ignorati.
Codure del

3
In effetti, ritengo che sia una caratteristica lasciare sul posto i file ignorati, facoltativamente.
Macetw

15

Modificare le risposte di Yanal-Yves Fargialla e gimpf usando Powershell (ma non poter commentare il post originale di StackOverflow):

powershell -Command "&{(svn status --no-ignore) -match '^[\?i]' -replace '^.\s+' | rm -recurse -force}

Ciò aggiunge il carato ("^") per specificare l'inizio della riga, evitando la corrispondenza di tutti i file che contengono la lettera "i". Aggiungete anche i flag per -recurse e -force a rm per rendere questo comando non interattivo e quindi utilizzabile in uno script.


Il comando richiede una doppia virgoletta aggiuntiva alla fine. Lo aggiungerei solo, ma le modifiche devono essere almeno sei caratteri apparentemente.
Ian Miller,

7

Molte cose in SVN possono essere fatte in diversi modi, come evidenziato dalle varie risposte della riga di comando fornite qui. Con l'avvento della versione 1.7 esiste ancora un'altra tecnica per TortoiseSVN che, in effetti, fornisce una risoluzione del grano più fine rispetto alla risposta fornita da Stefan, che consente di selezionare file non versione separatamente dai file ignorati. Basta selezionare TortoiseSvn >> Clean up...per aprire questa finestra di dialogo.

Opzioni di pulizia di TortoiseSVN


7

Con PowerShell:

(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm

Dalla riga di comando:

powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}"

3
Adoro questo puro script di Windows! Consiglierei -match '[\?i]' -replace '^.{8}'invece di utilizzare , che funziona correttamente anche se un nome file inizia con uno spazio bianco e cancella anche i file ignorati.
gimpf,

1
L'uso del tweak suggerito da gimpf funziona bene, ma ho riscontrato un caso in cui ho riscontrato ItemNotFoundException. A quanto pare, c'era solo un singolo file nel set di risultati dello stato svn. Questa correzione risolve il problema: code@ (svn status --no-ignore) -match '[\? I]' -replace '^. {8}' | rm `. Capito con l'aiuto di questo post
dirtybird,

1
e poiché ciò richiederà directory non in svn (poiché non è stato specificato recurse), non è utile per l'uso in uno script. Usa:powershell -Command "&{(svn status --no-ignore) -match '[\?i]' -replace '^.{8}' | remove-item -force -recurse}"
thinkOfaNumber

6

Questo oneliner funziona per me (basato sulla risposta di Richard Hansen, che sorprendentemente non ha funzionato per i file contenenti spazi):

svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}

2
per eliminare anche le cartelle non controllate, aggiungere -fral rmcomando: svn status --no-ignore | grep '^ [I?]' | taglio -c 9- | xargs -d "\ n" -I {} rm -fr {}
Dennis Golomazov

5

Utilizzando TortoiseSVN:

  1. Fare clic con il tasto destro del mouse sulla radice della copia di lavoro e selezionare TortoiseSVN -> "verifica la presenza di modifiche"
  2. Seleziona "Mostra file ignorati"
  3. Ordina per colonna "Stato testo"
  4. scorrere fino ai file "senza versione", ora tutti raggruppati insieme; selezionali tutti e fai clic con il pulsante destro del mouse -> elimina
  5. scorrere fino ai file "ignorati", ora tutti raggruppati insieme; selezionali tutti e fai clic con il pulsante destro del mouse -> elimina

Non è davvero una soluzione bella e pulita, ma il modo più veloce che conosco (su Windows).

Grazie a pkh per il suggerimento con i file ignorati.


Credo che questo rimuoverà solo i file senza versione. Gli articoli ignorati non saranno interessati.
Dirk Vollmar,

2
Non è necessario utilizzare la finestra di dialogo di commit e è possibile ottenere file ignorati: fare clic con il tasto destro | TortoiseSVN | Verifica modifiche. Quindi puoi fare clic su "Mostra file ignorati" e ordinare / eliminare in modo appropriato.
pkh,

4

Questo è simile ad altre risposte, ma in realtà viene ignorato i file (notare l'io nelle RE):

 rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'`

1
questo si interrompe se un nome file contiene spazi bianchi
Richard Hansen

4

Qualcuno ha detto che non puoi farlo dalla riga di comando di Windows.

Toro.

for /f "tokens=2 delims= " %I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%I" & rmdir /S /Q "%I")

Lo fa in una riga e non richiede un singolo strumento GNU. :)


for /f "tokens=2 delims= " %%I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%%I" & rmdir /S /Q "%%I")
Darien Pardinas,

@DarienPardinas, la tua versione è particolarmente utile se si collega un "Esegui comando batch di Windows" di Jenkins, che ho appena appreso non è un prompt dei comandi ma più simile a uno script batch, quindi la necessità di %%over%
jxramos

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.