Come posso ripristinare un commit SVN?


303

Ho trovato vari esempi di come ripristinare un commit SVN come

svn merge -r [current_version]:[previous_version] [repository_url]

o

svn merge -c -[R] .

Ma nessuno dei due sembra funzionare. Ho provato quei comandi e ho controllato i file che sono stati modificati a mano.

Come posso ripristinare un commit con la revisione numero 1944? Come posso verificare che il ripristino sia stato eseguito (senza guardare nel file effettivo le modifiche sono state ripristinate)?


16
Non hai mai accettato una risposta perché nessuno di loro ha funzionato?
2

4
Se vuoi una risposta letterale usa "svn merge -c -1944". Per verificare se ha funzionato: "svn diff"
John Sampson,



E se fosse così, ho il 1943 (buon impegno), poi il 1944 (cattivo impegno), poi il 1945 (buon impegno), quindi il 1946 (buon impegno). Ora voglio rimuovere solo il 1944 (cattivo commit) e mantenere tutta la revisione dopo il 1944, significa che voglio un risultato come il 1943, 1945, 1946 (rimuovi solo il 1944) da tutte queste revisioni, cosa dovrei fare ??
Bhavin_m

Risposte:


448

Entrambi gli esempi devono funzionare, ma

svn merge -r UPREV:LOWREV . annulla intervallo

svn merge -c -REV . annulla revisione singola

in questa sintassi - se la directory corrente è WC e (come deve essere fatto dopo ogni unione), eseguirai il commit dei risultati

Vuoi vedere i registri?


9
@dwjohnston - sì, le fusioni vengono sempre eseguite in WC e non è un'attività sul lato server
Lazy Badger

14
svn: Merge source required. Niente da fare.
2

27
@ 2rs2ts sembra che tu abbia dimenticato il punto finale per designare "fallo nella directory corrente".
Dalin,

14
puoi anche eseguire più commit singoli contemporaneamente:svn merge -c -42587,-42589 .
ml

1
@ahnbizcad - revisione (singola), che vuoi annullare
Lazy Badger,

130

Se si utilizza il client TortoiseSVN , è possibile farlo facilmente tramite la finestra di dialogo Mostra registro .


5
Questo è di gran lunga il modo più semplice per farlo
Markku K.

5
Questo è obsoleto. Non esiste più un menu contestuale disponibile per il client nella versione corrente.
user1789573

19
Che cosa? TortoiseSVN È un menu di scelta rapida, oltre alle finestre di dialogo che genera. Cosa intendi con "non esiste più un menu di scelta rapida"? Certamente c'è!
Ben

@Ben Penso che l'utente1789573 si sia inciampato un po 'sulla menzione esplicita di "Menu contestuale" nel tutorial collegato nella risposta.
Tom Catullo,

2
Nel caso in cui lo vedi più tardi, è (ancora) lì. Nella schermata del registro degli spettacoli, fai clic con il pulsante destro del mouse sulla revisione e c'è un'opzione "Ripristina questa revisione". Questo è in TortoiseSVN 1.9.4 Build 27285. L'ho appena usato e posso dirti che funziona bene.
Bruce Van Horn,

65

svn merge -r 1944:1943 .dovrebbe ripristinare le modifiche di r1944 nella copia di lavoro. È quindi possibile rivedere le modifiche nella copia di lavoro (con diff), ma è necessario eseguire il commit per applicare il ripristino nel repository.


4
Non funziona, richiede unisci sorgente. Ho provato svn merge -r 1944:1943 .invece, ma nulla è cambiato.
Alex,

Il repository è avanzato dal r1944? In tal caso, ci sono modifiche contrastanti sulle stesse righe delle modifiche tra r1943 e r1944?
onon15,

Sono alla revisione del 1945 e non sembra esserci un conflitto. Né svn statussvn diffdà nulla.
Alex,

7
Errore:svn: Try 'svn help' for more info svn: Merge source required
Alex

5
Ma svn merge -r 1945:1943 .sembra aver funzionato. Penso di aver capito: devi unire la versione di "prima" del "cattivo" commit nel tuo repository funzionante. Questo va bene quando vuoi fare un semplice "ripristino" del commit precedente. Ma cosa succede se si desidera ripristinare le modifiche apportate con la versione 1900?
Alex,

45

Innanzitutto, ripristina la copia di lavoro nel 1943.

> svn merge -c -1943 .

Secondo, controlla cosa sta per essere commesso.

> svn status

In terzo luogo, esegui il commit della versione 1945.

> svn commit -m "Fix bad commit."

In quarto luogo, guarda il nuovo registro.

> svn log -l 4

------------------------------------------------------------------------
1945 | myname | 2015-04-20 19:20:51 -0700 (Mon, 20 Apr 2015) | 1 line

Fix bad commit.
------------------------------------------------------------------------
1944 | myname | 2015-04-20 19:09:58 -0700 (Mon, 20 Apr 2015) | 1 line

This is the bad commit that I made.
------------------------------------------------------------------------
1943 | myname | 2015-04-20 18:36:45 -0700 (Mon, 20 Apr 2015) | 1 line

This was a good commit.
------------------------------------------------------------------------

1
E se fosse così, ho il 1943 (buon impegno), poi il 1944 (cattivo impegno), poi il 1945 (buon impegno), quindi il 1946 (buon impegno). Ora voglio rimuovere solo il 1944 (cattivo commit) e mantenere tutta la revisione dopo il 1944, significa che voglio un risultato come il 1943, 1945, 1946 (rimuovi solo il 1944) da tutte queste revisioni, cosa dovrei fare ??
Bhavin_m

26

È impossibile "annullare il commit" di una revisione, ma è possibile ripristinare la copia di lavoro alla versione 1943 e impegnarla come versione 1945. Le versioni 1943 e 1945 saranno identiche, annullando efficacemente le modifiche.


18
Giusto per essere fastidiosamente accurato, vorrei commentare che se si dispone dell'accesso di amministratore al repository, è possibile "annullare il commit". Questo creando un repository clone fino a una data revisione usando svn dumpe quindi svn load. Ma, naturalmente, questo non dovrebbe essere usato in circostanze normali.
onon15,

4
Non voglio annullare il commit, voglio creare un nuovo numero di commit con un certo commit invertito. I set dicono che ho verificato la versione 1944, fatto un commit nel 1945, che voglio "ripristinare". Quindi voglio avere una versione 1946, i cui file sono identici a quelli della versione 1944. (Tranne la storia ovviamente.) Ma la domanda rimane: come farlo? Quali sono i comandi?
Alex,

//, @Alex, sono interessato anche a questo, specialmente a qualcosa di analogo a $ git revert. Ho trovato un po 'difficile imparare SVN dopo aver usato Git per così tanto tempo.
Nathan Basanese,

10

Quanto segue farà una corsa a secco, come dice. HEAD è la versione corrente, PREV è precedente, quindi il percorso del tuo file o elemento di commit:

svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk

Se la corsa a secco sembra buona, esegui il comando senza --dry-run

Verificare la modifica nella revisione e ripetere il commit. Per cercare i numeri di versione provare:

svn log

4
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F

Ciò richiede che la copia locale sia diversa dalla revisione errata?
Eliezer Miron,

2

Alex, prova questo: svn merge [WorkingFolderPath] -r 1944: 1943


2

Sebbene i suggerimenti già forniti possano funzionare per alcune persone, non funziona per il mio caso. Quando eseguono l'unione, gli utenti a rev 1443cui eseguono l' aggiornamento rev 1445, sincronizzano comunque tutti i file modificati 1444anche se sono uguali 1443all'unione. Avevo bisogno che gli utenti finali non vedessero affatto l'aggiornamento.

Se si desidera nascondere completamente il commit, è possibile creare un nuovo ramo alla revisione corretta e quindi scambiare i rami. L'unica cosa è che è necessario rimuovere e aggiungere nuovamente tutti i blocchi.

copy -r 1443 file:///<your_branch> file:///<your_branch_at_correct_rev>
svn move file:///<your_branch> file:///<backup_branch>
svn move file:///<your_branch_at_correct_rev> file:///<your_branch>

Questo ha funzionato per me, forse sarà utile a qualcun altro là fuori =)


2
svn merge -c -M PATH

Questo mi ha salvato la vita.

Stavo avendo lo stesso problema, dopo essere tornato indietro non vedevo il vecchio codice. Dopo aver eseguito il comando sopra ho ottenuto un codice pulito della vecchia versione.


1

Ho provato quanto sopra, ( svn merge) e hai ragione, lo fa jack. però

svn update -r <revision> <target> [-R]

sembra funzionare, ma non è permanente (il mio svn mostra semplicemente una vecchia revisione). Quindi ho dovuto

mv <target> <target backup>
svn update <target>
mv <target backup> <target>
svn commit -m "Reverted commit on <target>" <target>

Nel mio caso particolare il mio obiettivo è interfaces/AngelInterface.php. Ho apportato modifiche al file, li ho impegnati, ho aggiornato il computer di build con il compilatore phpdoc e ho scoperto che le mie modifiche erano una perdita di tempo. svn log interfaces/AngelInterface.phpmostra la mia modifica come r22060 e il commit precedente su quel file era r22059. Quindi posso svn update -r 22059 interfaces/AngelInterface.phpe finisco con il codice com'era di nuovo in -r22059. Poi :-

mv interfaces/AngelInterface.php interfaces/AngelInterface.php~
svn update interfaces/AngelInterface.php
mv interfaces/AngelInterface.php~ interfaces/AngelInterface.php
svn commit -m "reverted -r22060" interfaces/AngelInterface.php

In alternativa, potrei fare la stessa cosa su una directory, specificando . -Ral posto di interfaces/AngelInterface.phptutto quanto sopra.


1
Un'altra cosa, come già detto, ciò che non puoi fare è rimuovere il commit dalla cronologia, come puoi fare in git hackerando direttamente gli ref. Tutto quello che puoi fare è usare il repository per cambiare la tua fonte nel modo in cui lo intendi e commetterlo come cambiamento.
Sibaz,

Dopo aver studiato ulteriormente, posso vedere che è possibile rimuovere il commit dalla cronologia usando svnadmin, ma sei fortemente sconsigliato. Vedere stackoverflow.com/questions/5566327/...
sibaz

0

Se si desidera rimuovere completamente i commit dalla cronologia, è anche possibile eseguire un dump del repository a una revisione specifica, quindi importare tale dump. In particolare:

svnrdump dump -r 1:<rev> <url> > filename.dump

Il comando svnrdump svolge la stessa funzione del dump svnadmin ma funziona su un repository remoto.

Quindi importa semplicemente il file di dump nel tuo repository preferito. Questo è stato testato per funzionare bene su Beanstalk.

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.