Qual è un modo semplice per ripristinare un file in subversion?

Queste istruzioni sono un po ‘intimidatorie e confuse: http://svnbook.red-bean.com/en/1.0/ch04s04.html#svn-ch-4-sect-4.3 . Inoltre, non sembrano menzionare che è molto più semplice se non hai ancora effettuato il check-in dopo aver eseguito ” svn rm ” [1].

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

[1] Ad un principiante svn, potrebbe sembrare che ” svn rm ” distrugga immediatamente il file. Ricordo di aver pensato di rimuoverlo dal controllo del codice sorgente e di spaventarlo quando il file stesso era 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?

Se l’hai appena fatto

 svn rm foo.txt 

quindi puoi annullarlo semplicemente

 svn revert foo.txt 

Se hai già effettuato il check-in dopo aver eseguito ” svn rm “, puoi guardare il log ( svn log ), trovare l’ultima revisione in cui il file esiste e prenderlo da quella versione.

Un modo per farlo è quello di unire nella vecchia revisione che ha il file. Supponendo che la revisione corrente sia 123 e l’ultima versione con quel file sia 120, allora fai questo:

 svn merge -r123:120 

Forse prima fai una prova a secco per assicurarti che non faccia nulla che non vuoi:

 svn --dry-run merge -r123:120 

Per la domanda secondaria, come rimuovere un file da svn senza rimuovere la copia locale:

 svn rm foo.txt --keep-local 

O, naturalmente, si può semplicemente copiare in un file temporaneo prima di svn rm’ing e quindi copiare nuovamente:

 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 

per qualche ragione, il -r arg non funzionava per me (svn versione 1.6.9). Ho provato prima e dopo il src , ma continuavo a ricevere un messaggio che il file non è stato trovato nella revisione corrente (duh). Lo stesso con –revision. Utilizzando la syntax stile @ ha funzionato però:

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

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

 svn rm foo.txt --keep-local 

Per recuperare un file dopo aver eseguito il commit della rimozione, puoi utilizzare il comando di unione o il comando di copia: entrambi conserveranno la cronologia dei file. Dal momento che il metodo unione è già descritto altrove, ecco il modo 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" 

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] 

Per gli utenti di TortoiseSVN, questo è molto semplice grazie al Repo Browser. All’interno del Repo Browser passare alla revisione prima che il file fosse cancellato (puoi cambiare la versione usando il pulsante “Revision:” in alto a destra):

inserisci la descrizione dell'immagine qui

Dovresti quindi essere in grado di vedere il file eliminato nella sua posizione originale nel Repo Browser. Fai clic destro su di esso e seleziona “Copia su copia di lavoro …”:

inserisci la descrizione dell'immagine qui

Il file verrà quindi ripristinato sulla copia di lavoro pronta per il commit (come se fosse stata aggiunta svn) e con la sua cronologia di registro intatta.

Ho usato la voce di menu copia della revisione precedente usando la tartaruga, ho lavorato per me e ho mantenuto la cronologia.