Come posso ripristinare un commit SVN?

Ho trovato vari esempi su 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 faccio a ripristinare un commit con la revisione numero 1944? Come faccio a verificare che il ripristino sia stato eseguito (senza cercare nel file effettivo le modifiche sono state annullate)?

Entrambi gli esempi devono funzionare, ma

svn merge -r UPREV:LOWREV . annullare intervallo

svn merge -c -REV . annullare la revisione singola

in questa syntax: se la directory corrente è WC e (come in deve essere eseguita dopo ogni unione), i risultati verranno confermati

Vuoi vedere i log?

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

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

Per prima cosa, ripristina la copia di lavoro nel 1943.

 > svn merge -c -1943 . 

Secondo, controlla cosa sta per essere commesso.

 > svn status 

In terzo luogo, commetti la 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. ------------------------------------------------------------------------ 

È imansible “annullare” una revisione, ma è ansible ripristinare la copia di lavoro alla versione 1943 e confermarla come versione 1945. Le versioni 1943 e 1945 saranno identiche, in modo efficace per ripristinare le modifiche.

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

 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

Verifica la modifica nella revisione e re-commit. Per cercare i numeri di versione prova:

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

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

 svn merge -c -M PATH 

Questo mi ha salvato la vita.

Stavo avendo lo stesso problema, dopo il ripristino anche io non vedevo il vecchio codice. Dopo aver eseguito il comando sopra ho ottenuto un vecchio codice di versione pulito.

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

 svn update -r   [-R] 

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

 mv   svn update  mv   svn commit -m "Reverted commit on "  

Nel mio caso particolare il mio objective è interfaces/AngelInterface.php . Ho apportato delle modifiche al file, le ho confermate, aggiornato il computer di compilazione, ho eseguito il compilatore phpdoc e ho scoperto che le mie modifiche erano una perdita di tempo. svn log interfaces/AngelInterface.php mostra la mia modifica come r22060 e il commit precedente su quel file era r22059. Quindi posso svn update -r 22059 interfaces/AngelInterface.php e svn update -r 22059 interfaces/AngelInterface.php nuovo con il codice come era in -r22059 di nuovo. 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 . -R . -R al posto delle interfaces/AngelInterface.php in tutto quanto sopra.

Sebbene i suggerimenti forniti possano già funzionare per alcune persone, non funzionano nel mio caso. Quando si esegue l’unione, gli utenti al rev 1443 che aggiornano al rev 1445 , ancora sincronizzano tutti i file modificati nel 1444 anche se sono uguali a 1443 dall’unione. Avevo bisogno che gli utenti finali non vedessero affatto l’aggiornamento.

Se si desidera hide completamente il commit, è ansible creare un nuovo ramo alla revisione corretta e quindi scambiare i rami. L’unica cosa è che devi rimuovere e aggiungere tutte le serrature.

 copy -r 1443 file:/// file:/// svn move file:/// file:/// svn move file:/// file:/// 

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

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

 svnrdump dump -r 1:  > filename.dump 

Il comando svnrdump esegue la stessa funzione di svnadmin dump ma funziona su un repository remoto.

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