Esiste un comando Subversion per ripristinare la copia di lavoro?


110

Esiste un singolo comando Subversion che "reimposta" una copia funzionante esattamente allo stato memorizzato nel repository? Qualcosa come git reset --hardo (ah, hard Git reset non rimuove neanche i file senza versione!) rm -rf wc && svn co <url> wc.

Aggiornamento: non sto cercando un semplice ripristino, in quanto ciò non elimina i file aggiuntivi nella copia di lavoro. Voglio davvero qualcosa che sia lo stesso che eliminare la copia di lavoro e controllarla di nuovo, solo senza dover scaricare nuovamente i dati. (Ovviamente non mi dispiace perdere tutte le modifiche non impegnate.)


ripristinare tutte le modifiche nella copia di lavoro?
mauris

5
Utilizzeresti git clean -xdfper rimuovere cose che non sono sotto il controllo del codice sorgente.
vcsjones

1
@vcsjones: Grazie, la pagina man per le git cleancitazioni è esattamente quello che sto cercando: "Questo può essere usato (possibilmente insieme a git reset) per creare una directory di lavoro incontaminata per testare una build pulita." Peccato che Subversion non sembri avere nulla di simile a questo built-in.
Zoul

Risposte:


180

Puoi tornare ricorsivamente in questo modo:

svn revert --recursive .

Non c'è modo (senza scrivere uno script creativo) per rimuovere le cose che non sono sotto il controllo del codice sorgente. Penso che il più vicino che potresti fare è iterare su tutti i file, usare poi grep il risultato di svn list, e se grep fallisce, cancellalo.

MODIFICA : la soluzione per lo script creativo è qui: rimuovi automaticamente i file senza versione di Subversion

Quindi potresti creare uno script che combini una revertcon qualsiasi risposta nella domanda collegata più adatta a te.


3
Potresti anche voler correre prima svn cleanupsul wc. Questa è la mia pratica standard per ripulire dopo unioni interrotte e quant'altro.
Mike Miller

tortoise ha anche un'opzione "rimuovi i file senza versione" nella finestra di dialogo di pulizia.
v.oddou

2
Sarebbe bello se "rimuovi file senza versione" fosse disponibile tramite riga di comando. Soprattutto per build automatizzate.
C. Tewalt

3
Vedi la mia risposta ... -remove-unversioned esiste per la pulizia svn
Denny Weinberg,

38

Per ripristinare i file tracciati

svn revert . -R

Per pulire i file non tracciati

svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

All'inizio -rfpotrebbe / dovrebbe sembrare spaventoso, ma una volta capito non sarà per questi motivi:

  1. Solo le directory completamente non tracciate corrisponderanno al modello passato rm
  2. Il -rfè necessario, altrimenti non verranno rimossi queste directory

Per ripristinare quindi pulire (la domanda OP)

svn revert . -R && svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

Per una facilità d'uso costante

Aggiungi un alias permanente al tuo .bash_aliases

alias svn.HardReset='read -p "destroy all local changes?[y/N]" && [[ $REPLY =~ ^[yY] ]] && svn revert . -R && rm -rf $(awk -f <(echo "/^?/{print \$2}") <(svn status) ;)'

il secondo snippet non sembra funzionare per me:awk: fatal: error reading input file '-': Input/output error
hbogert

Ho dovuto sfuggire al ?nel awkcomando, altrimenti abbinato tutte le linee nell'output disvn status
gpanders

23

Elimina tutto all'interno della tua copia locale utilizzando:

rm -r your_local_svn_dir_path/*

E ripristina tutto in modo ricorsivo usando il comando seguente.

svn revert -R your_local_svn_dir_path

Questo è molto più veloce dell'eliminazione dell'intera directory e quindi di un nuovo checkout, perché i file vengono ripristinati dai tuoi metadati SVN locali. Non necessita nemmeno di una connessione di rete.


4
molto più veloce è svn cleanup --remove-unversioned.
Znik

7
svn revert . -R

per resettare tutto.

svn revert path/to/file

per un singolo file


1
Ciò non elimina i file non modificati in eccesso nella copia di lavoro, vero?
Zoul

@zoul Non la penso così, ma non citarmi su questo dato che è passato del tempo da quando ho usato SVN
Abe Voelker

purtroppo non tocca i file non tracciati. prova svn revert -R your_local_svn_dir_path
Znik

7

Elimina i file senza versione e annulla le modifiche:

svn revert D:\tmp\sql -R
svn cleanup D:\tmp\sql --remove-unversioned

Su:

D         D:\tmp\sql\update\abc.txt

1
questa è la risposta migliore, senza script aggiuntivi. questo è universale e compatibile con molte versioni di svn.
Znik

3

Soluzione cmd / bat di Windows puro:

svn cleanup .
svn revert -R .
For /f "tokens=1,2" %%A in ('svn status --no-ignore') Do (
     If [%%A]==[?] ( Call :UniDelete %%B
     ) Else If [%%A]==[I] Call :UniDelete %%B
   )
svn update .
goto :eof

:UniDelete delete file/dir
IF EXIST "%1\*" (
    RD /S /Q "%1"
) Else (
    If EXIST "%1" DEL /S /F /Q "%1"
)
goto :eof

2

Eliminare la copia di lavoro dal sistema operativo e verificarlo di nuovo è il più semplice, ma ovviamente non un singolo comando.


Dolorosamente lento. Ecco perché stavo cercando un modo per aggirare questo.
Zoul

1
+1, Questo è spesso l'unico modo per risolvere strani problemi, almeno quello che ho trovato.
Brad

2

Molto veloce e semplice e fa esattamente quello che vuoi

svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'

/(Config|.ini)/ è per i miei scopi.

E potrebbe essere una buona idea aggiungere --no-ignore al comando svn


2
È così orribile. E gli utenti Windows? Subversion ovviamente ha bisogno di un po 'di lavoro prima di poter essere preso sul serio come strumento di controllo della versione.
Warren P

1

Per rimuovere i file non tracciati

Sono stato in grado di elencare tutti i file non tracciati segnalati da svn stin bash facendo:

echo $(svn st | grep -P "^\?" | cut -c 9-)

Se ti senti fortunato, puoi sostituire echocon rmper eliminare i file non tracciati. Oppure copia i file che vuoi eliminare a mano, se ti senti meno fortunato.


(Ho usato la risposta di @ abe-voelker per ripristinare i file rimanenti: https://stackoverflow.com/a/6204601/1695680 )

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.