Ripristino di un singolo file in SVN a una revisione particolare


182

Ho un file come mostrato di seguito in un repository SVN che vorrei ripristinare a una versione precedente. Qual è il modo di farlo in SVN? Voglio solo eseguire il downgrade di questo particolare file a una versione precedente, non all'intero repository.

Grazie.

$ svn log myfile.py
----------------------
r179 | xx | 2010-05-10

Change 3
----------------------
r175 | xx | 2010-05-08

Change 2
----------------------
r174 | xx | 2010-05-04

Initial

quando hai detto di tornare, cosa volevi dire, 7 anni fa, lol
Kalpesh Soni,

Risposte:


181

Se vuoi solo il vecchio file nella tua copia di lavoro:

svn up -r 147 myfile.py

Se vuoi eseguire il rollback, vedi questo " Come tornare a una versione precedente del nostro codice in sovversione? ".


8
ma la prossima volta che aggiorni ottiene il file che non volevi indietro ...: S
andygoestohollywood

2
se non lo vuoi indietro, svn commetti quel file, per mettere la versione che vuoi nel repository
Packet Tracer,

14
Questo probabilmente non fa effettivamente quello che voleva la domanda. Usando questo, la copia di lavoro è pulita e non può essere salvata COSÌ COM'È, e un "aggiornamento svn" senza un numero di versione specificato recupererà l'ultima versione indesiderata.
CXJ,

1
Come posso quindi eseguire il commit del file ripristinato?
marcio,

2
Questo non è del tutto corretto perché, come menzionato da CXJ, non esiste un modo per eseguire il commit del file aggiornato. Probabilmente vuoi fare come dice Mitch Dempsey (nota, tuttavia, --force per forzare la sovrascrittura del file): svn export --force -r 147 myfile.py myfile.py
avejidah

76

svn cat prende anche una revisione arg!

svn cat -r 175 mydir/myfile > mydir/myfile


20
Questa è di gran lunga la migliore risposta sulla pagina. Lascia il file modificato in uno stato che può essere eseguito il commit.
dotancohen

questo non sembra funzionare quando si incolla un nuovo file
ahnbizcad il

haha guardando indietro, idk a quale contesto stavo pensando quando ho pubblicato. Non ricordo. Sembra assurdo.
ahnbizcad,

Questo è semplice e diretto per quando si desidera semplicemente annullare le modifiche e riportare un file nel suo stato di pre-commit senza alcun controllo tecnico della versione.
Anonimo il

57
svn revert filename 

questo dovrebbe ripristinare un singolo file.


4
Che succede con tutte le altre risposte con comandi più lunghi? Grazie.
masterxilo,

Prego. Non ho idea di cosa
succeda

13
Questo torna a quale revisione? Doc dice che sostituisce solo con gli ultimi repository. La domanda è come ripristinare una versione precedente.
tgkprog,

1
Questo ritorna all'ultima versione del repository. Se leggi la descrizione delle domande, sembra che stesse cercando come ripristinare un singolo file, non l'intera directory.
thestar,

5
Credo che tutto ciò non faccia altro che distruggere la tua copia di lavoro "ripristinandola" alla testa. O a cui è mai stato verificato. confermare eseguendo svn update -r file VER, quindi eseguire un ripristino svn.
Gerard ONeill,

50

Per un singolo file, puoi fare:

svn export -r <REV> svn://host/path/to/file/on/repos file.ext

Si potrebbe fare svn revert <file>ma ciò ripristinerà solo l'ultima copia funzionante.


2
esportare, quindi incollarlo nella copia locale, quindi eseguirlo nuovamente?
tgkprog,

1
@tgkprog è un modo per farlo, sì
Mitch Dempsey,

@tgkprog e qual è il modo "preferito"?
hbogert,

Nessuna idea, ma è quello che ha funzionato per me: revisione passata esportata. Aperto nel blocco note, copiato, incollato nel file di lavoro. Impegnati a testa con un commento su quale rev e perché. Gli strumenti dell'interfaccia utente potrebbero avere un modo migliore.
tgkprog,

21

Finora tutte le risposte qui sembrano avere degli svantaggi significativi, sono complicate (è necessario trovare l'URI del repository) o non fanno ciò che probabilmente la domanda ha posto: Come riportare il Repo in uno stato funzionante con quella versione precedente del file .

svn merge -r head:[revision-number-to-revert-to] [file-path]IMO è il modo più semplice e pulito per farlo. Si noti che il ripristino di un file eliminato non sembra funzionare in questo modo [1]. Vedi anche la seguente domanda: Un modo migliore per ripristinare una precedente revisione SVN di un file?

[1] Per quello che vuoi svn cp -r [rev-number] [repo-URI/file-path]@[rev-number] [repo-URI/file-path] && svn up, vedi anche Qual è il modo corretto di ripristinare un file cancellato da SVN?


Vorrei sottolineare che, almeno per la mia versione di Subversion, svn mergenon accetta più file come argomento per qualche motivo. In questo caso sembra non fare proprio nulla (senza un messaggio di errore).
Wrzlprmft,

Ma il mio comando funziona ancora ripetendolo per ogni file, giusto?
Michel Müller,

Sì, lo fa davvero.
Wrzlprmft,

1
Concordato che questo è il più pulito.
KevinG,

13

Il modo migliore è:

svn merge -c -RevisionToUndo ^/trunk

Questo annullerà tutti i file della revisione piuttosto che ripristinare quei file che non ti piace annullare. Non dimenticare il trattino ( -) come prefisso per la revisione.

svn revert File1 File2

Ora esegui nuovamente il commit delle modifiche.


9

Vuoi fare

svn merge -r [revision to revert from]:[revision to revert to] [path/filename]

Una volta fatto, avrai quella revisione del file in uno stato commitabile. Salva il file.


7

Ho scoperto che è semplice farlo tramite il svn catcomando in modo da non dover nemmeno specificare una revisione.

svn cat mydir/myfile > mydir/myfile

Questo probabilmente non ricondurrà i dati di inode (metadati) come i timestamp.


quindi eseguire il commit del file in modo che vada al repo
tgkprog il

3
Questo ha funzionato per me meglio dell'aggiornamento. Perché l'aggiornamento non consente di eseguire il commit della modifica apportata a quel file. (svn 1.8.3)
fe_lix_

7

sorpreso che nessuno lo abbia menzionato

senza scoprire il numero di revisione potresti scrivere questo, se hai appena commesso qualcosa che vuoi ripristinare, questo non funzionerà se hai cambiato qualche altro file e il file di destinazione non è l'ultimo file modificato

svn merge -r HEAD:PREV file

se hai commenti, discuti qui prima di apportare modifiche?
Kalpesh Soni,

1
Lo scenario nella domanda non richiede una fusione inversa della modifica più recente, in modo tale che dovremmo applicare le modifiche necessarie per passare da HEAD a PREV?
Nick Russo,

4
Il comando dovrebbe essere svn merge -r HEAD:PREV filecome diceva @Nick Russo
Heinz

4

Se sono solo un paio di file e se stai usando Tortoise SVN, puoi usare il seguente approccio:

  1. Fare clic con il tasto destro sul file sorgente e selezionare "TortoiseSVN" -> "Mostra registro".
  2. Fare clic con il tasto destro su una revisione nel registro e selezionare "Salva revisione in ...".
  3. Lascia che la vecchia revisione sovrascriva il tuo file corrente.
  4. Salva il file sorgente sovrascritto.

Ciò salva un nuovo file non verificato come file-xxxx in cui xxxx è il vecchio numero di revisione. Cosa facciamo dopo? eliminare la nuova revisione (ad esempio HEAD), rinominare il nuovo file, aggiungere, eseguire il commit?
Heinz,

No, non salvarlo con il numero di revisione nel nome del file. Salvalo con esattamente lo stesso nome del file della versione corrente dello stesso file (in altre parole, niente xxxx nel nome del file). Quindi esegui semplicemente un commit dopo quello.
Elling,

4

Sto solo aggiungendo alla risposta di @Mitch Dempsy poiché non ho ancora abbastanza rappresentante per commentare.

svn export -r <REV> svn://host/path/to/file/on/repos --force

L'aggiunta di --force sovrascriverà la copia locale con l'esportazione e quindi è possibile eseguire un commit svn per inviarlo al repository.


e questa è la risposta migliore :)
Zgr3doo,

perché questa è la risposta migliore? non gestisce la storia in "modo svn"
Jason S

2

Un'opzione alternativa per un singolo file è "sostituire" la versione corrente del file con la revisione precedente:

svn rm file.ext
svn cp svn://host/path/to/file/on/repo/file.ext@<REV> file.ext
svn ci

Ciò ha la caratteristica aggiunta che le modifiche indesiderate non vengono visualizzate nel registro per questo file (ad es. File di registro svn.ext).


1

Se si desidera ripristinare un singolo file da una revisione specifica ed essere in grado di eseguire il commit, procedere come segue:

svn merge -c - [OldRev #] [Nome file]

vale a dire. svn merge -c -150 myfile.py

Nota il negativo sul numero di revisione


-1
sudo svn revert filename

questo è il modo migliore per ripristinare un singolo file


2
Spero davvero che non ti avvicini mai a una macchina di produzione con autorizzazioni sudoer.
David Lakatos,
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.