Modo migliore per tornare a una precedente revisione SVN di un file?


167

Ho accidentalmente impegnato troppi file in un repository SVN e ho cambiato alcune cose che non intendevo. (Sospiro.) Per riportarli al loro stato precedente, il meglio che potevo inventare era

svn rm l3toks.dtx
svn copy -r 854 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

Cribbio! Non c'è modo migliore? Perché non posso semplicemente scrivere qualcosa del genere:

svn revert -r 854 l3toks.dtx

Ok, sto usando solo v1.4.4, ma ho sfogliato l'elenco delle modifiche per il ramo 1.5 e non sono riuscito a vedere nulla di direttamente correlato a questo. Mi sono perso qualcosa?


Modifica: immagino di non essere stato abbastanza chiaro. Io non credo di voler invertire la fusione, perché poi perderò i cambiamenti che ho fatto voglio fare! Dillo fileAe fileBsono stati entrambi modificati ma volevo solo impegnarmi fileA; digitando accidentalmente

svn commit -m "small change"

esegue il commit di entrambi i file e ora voglio tornare indietro fileB. La fusione inversa non rende questo compito (per quanto posso dire) più semplice dei passaggi che ho descritto sopra.


Risposte:


243
svn merge -r 854:853 l3toks.dtx

o

svn merge -c -854 l3toks.dtx

I due comandi sono equivalenti .


5
Grazie per questo, volevo solo dichiarare qualcosa - diciamo, sono alla revisione 855, voglio ripristinare un file alla revisione 854. Se lo faccio svn merge -c -854 my.file, e poi lo faccio svn diff, sembra mostrare una revisione prima dell'854 (ovvero 853 ); solo quando lo faccio svm merge -c 854 myfile(senza il -) sembra che il mio file sia ripristinato al numero 854. Grazie ancora, grazie!
sdaau,

11
C'è un motivo per cui la prima opzione sopra ha funzionato per me mentre la seconda non funzionava affatto?
skybondsor

7
Non dimenticare di impegnarti dopo la fusione inversa, però. Mi dimentico spesso :)
Vineeth Pradhan,

11
Dovrei davvero meno 1 questo per non dire quale sia la differenza tra questi due comandi. Scarsa risposta
Angry Dan,

4
@sprog - se c'è una differenza che mi farebbe piacere sapere
orip

34

Dai un'occhiata alla sezione " annulla modifiche " del libro svn


5
I collegamenti a risorse esterne sono incoraggiati, ma per favore aggiungi un contesto attorno al collegamento in modo che i tuoi colleghi utenti abbiano qualche idea di cosa sia e perché sia ​​lì. Cita sempre la parte più rilevante di un link importante, nel caso in cui il sito di destinazione sia irraggiungibile o rimanga permanentemente offline.
user2084795

32

mi dispiace occupare un po 'di spazio solo su una reiterazione della risposta precedentemente fornita, ma è qualcosa con cui finisco sempre nei guai.

Diciamo che ho aggiornato i file locali all'ultima revisione, che è 854. Quindi, vorrei ottenere una revisione precedente: la versione del file da qualche revisione precedente, diciamo revisione 851.

Copia funzionerebbe:

svn copy -r 851 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

.. tuttavia, non posso essere disturbato a cercare l'URL del repository :)

L'aggiornamento sembra funzionare:

svn up -r 851 ./l3toks.dtx

... tuttavia, contrassegna anche la copia locale come "appena estratto", o piuttosto "uguale alla revisione online" (ovvero in Tortoise / RabbitVCS viene visualizzato un segno di spunta verde OK) - il che significa che non è possibile farlo svn ci -m "rolled back to r 851": semplicemente perché il locale subversioneseguibile non noterà alcuna modifica locale e non si preoccuperà di caricare nulla nel repository online.

E, come già risposto, la fusione inversa funziona - ma in questo caso, non si dovrebbe fare affidamento sulla sintassi del collegamento; ma dichiarare specificamente:

svn merge -r HEAD:851 l3toks.dtx
--- Reverse-merging r854 through r852 into 'l3toks.dtx':
U    l3toks.dtx

Devo ammettere che non avrei mai capito la frase " Unire inversa r854 attraverso r852 nel file " significa " Ho appena ottenuto r851 del tuo file e ho sovrascritto tutto ciò che avevi precedentemente localmente - ed è contrassegnato come diverso dall'ultima revisione online, quindi puoi ricontrollarlo online come una nuova revisione " rollback" ", ma immagino (e spero :)) che sia quello che fa :)

Dopo questo, si può usare svn diffper una rapida verifica se abbiamo ottenuto la giusta revisione a livello locale; e inoltre, il file sarà contrassegnato da un punto esclamativo rosso in Tortoise / RabbitVCS (ovvero, diverso dall'ultima versione impegnata), e quindi svn ci -m "rolled back to r 851"può essere eseguito questa volta.

Inoltre, tieni presente che se alla fine cambi idea dopo la fusione inversa ( ovvero desideri comunque continuare a lavorare sull'ultima versione HEAD, qui 854 - dopo aver eseguito il rollback a 851 localmente, ma non hai ancora eseguito il rollback ), non dovresti usarlo svn up, perché dirà semplicemente che è già " Alla revisione 854 "; usa invece svn revert --recursive .o simili ...

Saluti!

Rif: Come ripristinare le modifiche utilizzando Subversion - Jacob Wright - Flex, AIR, PHP, ecc.

EDIT: ... e apparentemente, esattamente lo stesso effetto di svn merge -r HEAD:851 l3toks.dtx, può essere ottenuto con:

svn export -r 851 l3toks.dtx
A    l3toks.dtx
Export complete.

2
Preferisci SEMPRE l'esportazione svn, poiché fa esattamente quello che vuoi - controlla un file in una certa revisione, mentre la fusione inversa cercherà anche di unire le modifiche locali con la versione specificata, è un'operazione complessa e folle, che è soggetto a errori se non stai attento!
Falco,

1
Ho avuto problemi con l'unione inversa. Invece di capire perché, ho appena provato a esportare e ha funzionato perfettamente. Consiglio vivamente di usare solo l'esportazione. È possibile utilizzare --forceper sovrascrivere le directory. Ricorda solo che sovrascriverà eventuali modifiche.
Nick,

Ottima spiegazione di ciò che sta realmente accadendo! Uso AnkhSVN e TortoiseSVN frequentemente e non vedo nessun posto in cui utilizzarlo svn export: mi sto perdendo qualcosa o non è implementato in queste GUI?
Conrad

@Conrad, lo usi facendo clic su "Esporta ..." in AnkhSVN ed "Esporta" in TortoiseSVN dal menu contestuale del repository (tasto destro)
nitinr708

10

Di recente ho dovuto ripristinare una particolare revisione per eseguire il debug di una build precedente e questo ha funzionato come per magia:

svn up -r 3340 (or what ever your desired revision number)

Ho dovuto risolvere tutti i conflitti usando l'opzione "tc" perché non mi importava delle modifiche locali (ho controllato tutto quello che mi interessava prima di ripristinare)

Anche tornare alla testa è stato semplice:

svn up

5

Quello che stai cercando è chiamato "unione inversa". Dovresti consultare i documenti relativi alla funzione di unione nel libro SVN (come sottolinea luapyad, o più precisamente il primo commentatore su quel post). Se stai usando Tortoise, puoi anche andare nella vista del registro e fare clic con il tasto destro del mouse e scegliere "annulla modifiche da questa revisione" in quello in cui hai commesso l'errore.


4

L'unione inversa è esattamente ciò che vuoi (vedi la risposta di luapyad). Basta applicare l'unione al file commesso erroneamente anziché all'intera directory.


4

Se desideri annullare solo l'ultimo check-in, puoi utilizzare quanto segue

svn merge -r head:prev l3toks.dtx

In questo modo, non è necessario cercare i numeri della versione corrente e precedente.


4

svn merge unirà le revisioni, non le ripristina. cioè se hai qualche aggiunta nella tua versione HEAD, allora fondila con una revisione precedente, quindi la modifica continuerà.

Uso svn cat quindi lo reindirizzo nel file:

svn cat -r 851 l3toks.dtx > l3toks.dtx

Quindi hai il contenuto 851 in quel file e puoi ricontrollarlo.


3

Se usi l' IDE Eclipse con il plugin SVN puoi fare come segue:

  1. Fai clic con il pulsante destro del mouse sui file che desideri ripristinare (o sulla cartella in cui erano contenuti, se li hai eliminati per errore e desideri aggiungerli di nuovo)
  2. Seleziona " Squadra> Cambia "
  3. Scegli il pulsante di revisione "Revision" e inserisci il numero di revisione che desideri ripristinare. Clicca OK
  4. Vai alla prospettiva Sincronizza
  5. Seleziona tutti i file che desideri ripristinare
  6. Fai clic con il tasto destro del mouse sulla selezione ed esegui " Sostituisci e conferma ... "

Ciò ripristinerà i file alla revisione desiderata. Tieni presente che SVN vedrà le modifiche come un nuovo commit. Cioè, la modifica ottiene un nuovo numero di revisione e non esiste alcun collegamento tra la revisione precedente e quella nuova. È necessario specificare nei commenti di commit che si stanno ripristinando quei file a una revisione specifica.

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.