Comando SVN per eliminare tutti i file mancanti localmente


134

In SVN esiste un comando che posso usare per eliminare tutti i file mancanti localmente in una directory?

O in caso contrario, in qualche modo è possibile elencare solo i file mancanti (o, nel caso più generale, avere lo stato A, D,?, Ecc.)


1
Mantengo 1 cartella di lavoro e 1 cartella di pagamento. E sposta solo i file dalla cartella di lavoro alla cartella di estrazione. Se una cartella deve essere aggiunta / rimossa, la faccio manualmente e quindi sposto i file in quella cartella (ad esempio nuovi pacchetti, vecchi pacchetti). La maggior parte dei problemi svn si verificano quando si spostano le cartelle sulla copia di lavoro. Anche quando si copiano i file dalla copia di lavoro alla copia di pagamento, è necessario spostare solo i file, non le cartelle.
Siddharth,

Risposte:


99

Se stai usando TortoiseSVN, esegui un controllo per le modifiche , ordina per colonna Stato , seleziona tutte le voci contrassegnate missing, fai clic con il pulsante destro del mouse per aprire il menu di scelta rapida e seleziona Elimina . Infine, impegnarsi a pubblicare le modifiche nel repository.

Se sei su Windows, ma preferisci la riga di comando e ti diverti con PowerShell, questo one-liner farà il trucco:

svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }

Ossia, filtra l'output solo su quelle righe che mostrano i file mancanti (indicato da un'esclamazione all'inizio della riga), acquisisci il nome del file associato ed esegui un svn rmnome su quel file.

(Post di blog Rimuovere tutti i file "mancanti" da una copia di lavoro SVN fa qualcosa di simile per Unix / Linux.)


c'è un modo in eclipse usando il plugin subclipse? è così male aggiornarlo e poi trovarli nel progetto ed eliminarli di nuovo.
Stan,

Cordiali saluti, se è necessaria una password di sovversione ecco la sintassi: svn status --username user_name_here --password password_here | ? {$ _ -match '^! \ s + (. *)'} | % {svn rm $ Corrispondenze [1] - nome utente nome_utente_here - password password_here}
Jeff

dovresti impegnarti prima di questa riga prima di eseguire svn up? perché i file vengono ripristinati dal server svn
Pierre

Questa azione eliminerà anche i file dal repository?
Sebastián Ulloa,

175

Se si utilizza Mac ( Darwin ) o Linux, è possibile reindirizzare gli output dei seguenti comandi a svn rmtutti i file mancanti. È possibile impostare la directory di lavoro corrente sulla directory o sottodirectory appropriata prima di eseguirle, a seconda che si desideri eseguire l'intera copia di lavoro o solo un sottoinsieme.

  1. Esegui uno stato svn
  2. Cerca le righe che iniziano con "!" (mancante)
  3. Stampa "--force" (argomento svn) e la seconda colonna (il nome del file) dell'output da # 2
  4. Esegui svn rmusando l'output di # 3 come argomenti

Quindi il comando completo è:

svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm

Riferimenti:


4
Questo non funziona se ci sono spazi nel nome del file. Non so abbastanza awk per risolverlo, però.
bugloaf

2
Utilizza awk '{print " --force "$2"@"}'se il tuo nome file contiene un @(ad esempio se sei un sviluppatore iOS)
Guillaume Algis,

1
E gestire un nome file con spazi bianchi, awk '{$1=""; print " --force \""substr($0,2)"@\"" }'dovrebbe fare il trucco (e inizia a sembrare brutto)
Guillaume Algis

12
Il comando completo che si occupa dello spazio è "svn st | grep ^! | Awk '{$ 1 =" "; print" --force \ "" substr ($ 0,2) "@ \" "}' | xargs svn rm "
HelloWorld

1
Perché non lo metti --forcenella parte xargs?
jwg

53
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
  1. svn status
  2. Filtro solo su file mancanti
  3. Tagliare il punto esclamativo
  4. Filtra gli spazi bianchi finali
  5. Aggiungi la citazione principale
  6. Aggiungi preventivo finale
  7. svn remove ogni file

Questa soluzione funziona se ci sono spazi nei file / directory.
yuric

Come si aggiunge la verbosità a questo? xargs -verbose svn rm?
Tekius Fanatikus,

1
Solo un suggerimento per gli utenti di script ecc., Questo comando non riesce se non viene trovato alcun file da eliminare: svn: E205001: prova 'svn help delete' per ulteriori informazioni svn: E205001: argomenti insufficienti forniti
Thorsten Schöning

1
Il problema di @ ThorstenSchöning può essere risolto aggiungendo -ralle xargsopzioni (non eseguire, se non vengono forniti argomenti). Inoltre, il numero di argomenti dovrebbe essere limitato e le rimozioni dovrebbero essere raggruppate perché l'invocazione non riesce con un numero molto elevato di file da rimuovere, ad es -n 500. E, ultimo ma non meno importante, la quotazione eseguita non è ottimale per i file contenenti speciali shell come $- meglio usare \ncome delimitatore e lasciare la citazione per xargs:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
haui


19

Grazie a Paul Martin per la versione di Windows.

Ecco una leggera modifica allo script in modo da tenere conto anche dei file di Windows con spazi. Inoltre il missing.listfile verrà rimosso alla fine.

Ho salvato quanto segue in svndel.bat nella mia directory bin SVN (impostata nel mio ambiente %% PATH) in modo che possa essere chiamato da qualsiasi cartella al prompt dei comandi.

### svndel.bat
svn status | findstr /R "^!" > missing.list
for /F "tokens=* delims=! " %%A in (missing.list) do (svn delete "%%A")
del missing.list 2>NUL

bello vedere ancora apparire qualche codice batch innovativo :)
user230910

Caspita, ottima risposta. Stavo per andare con PowerShell, ma era molto più facile.
Jim Andrakakis,

Ho aggiunto un'altra riga dopo del missing.list 2>NUL, perché ho aggiunto tutti i nuovi file direttamente dopo aver rimosso i file eliminati, quindi ha aggiunto missing.lista svn: ha svn delete "missing.list"funzionato per me
Pierre,

Ho modificato questo script per tentare di eseguire da una posizione arbitraria, quindi ho riscontrato questo problema stackoverflow.com/questions/1137219/…, quindi sembra che DEVI utilizzare la Directory di lavoro corrente per eseguire questa azione.
Aolszowka,

7

Mi piace l'opzione PowerShell ... Ma ecco un'altra opzione se stai usando gli script batch di Windows:

svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)

5

Un'alternativa che funziona su Linux (bash) per i file da rimuovere che non contengono spazi nel percorso:

svn elimina `svn status | grep! | awk '{print $ 2}' '

4

Questo script di shell esamina in modo ricorsivo ( svn status) le directory del progetto, rimuovendo i file mancanti (come richiesto dalla domanda) e aggiungendo nuovi file al repository. È una sorta di "archivia nel repository l'attuale istantanea del progetto".

if [ $# != 1 ]
then
    echo  "usage: doSVNsnapshot.sh DIR"
    exit 0
fi

ROOT=$1

for i in `find ${ROOT} -type d \! -path "*.svn*" `
do

    echo
    echo "--------------------------"
    ( cd $i ; 
    echo $i
    echo "--------------------------"


    svn status | awk '  
            /^[!]/ { system("svn rm " $2) }
            /^[?]/ { system("svn add " $2) }
        '
    )
    echo

done

4

Una leggera modifica della riga di comando, che funziona su Mac OS (si spera anche su Linux) e gestisce i file segnalati dal comando "svm sr", come "! M" (mancante e modificato).

Gestisce gli spazi nei file.

Si basa su una modifica di una risposta precedente:

svn st | grep ! | sed 's/!M/!/' | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn --force rm

4

In realtà è possibile rimuovere completamente l' missing.listutente3689460 e Paul Martin

for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")

per riferimento - questo è DOS / cmd.exe in windows land
user230910

2

Quando si ha a che fare con molti file, può succedere che l'argomento dell'input su xargs stia diventando troppo lungo. Ho optato per un'implementazione più ingenua, che funziona anche in quel caso.

Questo è per Linux:

#! /bin/bash
# 1. get all statii in the working copy
# 2. filter out only missing files
# 3. cut off the status indicator (!) and only return filepaths
MISSING_PATHS=$(svn status $1 | grep -E '^!' | awk '{print $2}')
# iterate over filepaths
for MISSING_PATH in $MISSING_PATHS; do
    echo $MISSING_PATH
    svn rm --force "$MISSING_PATH"
done

1

Versione migliorata

Quindi il comando completo è:

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
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.