2009-01-30 8 views
60

Queste istruzioni sono un po 'intimidatorie e confuse: http://svnbook.red-bean.com/en/1.0/ch04s04.html#svn-ch-4-sect-4.3. E inoltre non sembrano menzionare che è molto più semplice se non hai ancora effettuato il check-in dopo aver eseguito "svn rm" [1].Qual è un modo semplice per ripristinare un file in subversion?

Quindi ho pensato che sarebbe stato un buon posto per registrare una risposta più semplice per chi googling per questo.

[1] Per un principiante svn, potrebbe sembrare che "svn rm" distrugga immediatamente il file. Ricordo di aver fatto svn rm pensando che sarebbe stato sufficiente rimuoverlo dal controllo del codice sorgente e spaventare quando il file stesso sarebbe effettivamente scomparso. Quindi una sotto-domanda è, qual è il modo giusto per rimuovere un file dal controllo di versione senza rimuovere effettivamente la tua copia locale?

+0

'stato svn | grep "^ D" | awk '{print $ 2}' | xargs svn revert' – sfiore

risposta

73

Se hai appena fatto

svn rm foo.txt 

allora si può annullare che con semplicemente

svn revert foo.txt 

Se già il check-in dopo aver fatto il "svn rm", allora si può guardare il registro (svn log) , trova l'ultima revisione in cui il file esiste e prendilo da quella versione.

Un modo per farlo è quello di unire nella vecchia revisione che ha il file. Supponendo che la versione attuale è 123 e l'ultima versione con quel file è di 120, poi fare questo:

svn merge -r123:120 

Forse prima fare una prova generale per assicurarsi che non farà nulla che non vuoi:

svn --dry-run merge -r123:120 

per la sub-domanda, come rimuovere un file da svn senza rimuovere la copia locale:

svn rm foo.txt --keep-local 

Or Naturalmente, si può solo copiare un file temporaneo prima di rimuoverli con rm svn e quindi copiare di nuovo:

cp foo.txt foo.txt-tmp 
svn rm foo.txt 
(svn ci -m "just removed foo.txt from the repository") 
cp foo.txt-tmp foo.txt 
+0

Il problema con l'unione è che perde la cronologia precedente del file. svn cp come dettagliato nella risposta di Stefan è probabilmente migliore, oltre che più facile da capire. – Avi

+0

Ottima risposta, ho salvato la giornata. Grazie! pls1 –

+0

Ho trovato se modificare l'ordine di versione, è solo aggiungere il file rimosso alla copia di lavoro corrente, senza altri cambiamenti di nessun file rimosso, ad es. 'svn merge -r120: 123 svn_url .' – zhuguowei

30

Per rimuovere un file, ma tenerlo in copia di lavoro, utilizzare

svn rm foo.txt --keep-local 

Per recuperare un file dopo aver eseguito il commit della rimozione, è possibile utilizzare il comando di unione o il comando di copia, entrambi conserveranno la cronologia dei file. Dal momento che il modo in cui unione viene già descritto altrove, ecco il modo di copia:

svn rm foo.txt 
svn ci foo.txt -m "removed file" 
(now at r5 as an example) 
svn cp url/to/removed/foo.txt -r4 foo.txt 
svn ci foo.txt -m "got file back" 
+7

Per funzionare, il comando copia deve essere un po 'diverso: svn cp url/to/removed/[email protected] -r4 foo.txt ---- senza il @ 4 Ottengo un errore "percorso non trovato" – Barth

33

per qualsiasi motivo, l'arg -r non funzionava per me (svn versione 1.6.9). Ho provato prima e dopo lo src, ma ho continuato a ricevere un messaggio che il file non è stato trovato nella revisione corrente (duh). Lo stesso con --revision. Utilizzando la sintassi @ stile lavorato però:

svn cp url/to/removed/[email protected] foo.txt 
+1

Questo era l'unico comando che ha funzionato per me. SVN 1.6.15 –

+0

Non so quale sia il modo più semplice per determinare l'ultima versione funzionante, ma questa affermazione è d'oro. –

1

ho usato la voce di menu copia rispetto alla precedente revisione utilizzando tartaruga, ha lavorato per me e ha mantenuto la storia.

+1

I suoni promettenti, puoi fornire maggiori dettagli? Da dove esatti esattamente il comando di copia? – VdesmedT

1

Per ripristinare un file eliminato in SVN. Trova il numero di revisione subito prima dell'eliminazione (ad esempio 341).Quindi ripristinare quel file da solo a quel numero di revisione.

svn up -r341 [path_to_deletedFile] 
+0

Ciò ottiene un'altra copia locale, ma il file rimane "eliminato" nel repository. Il tuo prossimo "svn up" lo vedrà sparire. – UncaAlby