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.)
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.)
Risposte:
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 rm
nome su quel file.
(Post di blog Rimuovere tutti i file "mancanti" da una copia di lavoro SVN fa qualcosa di simile per Unix / Linux.)
svn up
? perché i file vengono ripristinati dal server svn
Se si utilizza Mac ( Darwin ) o Linux, è possibile reindirizzare gli output dei seguenti comandi a svn rm
tutti 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.
svn rm
usando l'output di # 3 come argomentiQuindi il comando completo è:
svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm
Riferimenti:
awk '{print " --force "$2"@"}'
se il tuo nome file contiene un @
(ad esempio se sei un sviluppatore iOS)
awk '{$1=""; print " --force \""substr($0,2)"@\"" }'
dovrebbe fare il trucco (e inizia a sembrare brutto)
--force
nella parte xargs?
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
svn status
svn remove
ogni file-r
alle xargs
opzioni (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 \n
come delimitatore e lasciare la citazione per xargs
:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
Ho appena trovato questo, che fa il trucco, Rimuovi tutti i file "mancanti" da una copia di lavoro SVN :
svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )
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.list
file 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
del missing.list 2>NUL
, perché ho aggiunto tutti i nuovi file direttamente dopo aver rimosso i file eliminati, quindi ha aggiunto missing.list
a svn: ha svn delete "missing.list"
funzionato per me
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)
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
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
In realtà è possibile rimuovere completamente l' missing.list
utente3689460 e Paul Martin
for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")
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