Qual è il modo corretto per ripristinare un file eliminato da SVN?


119

Ho cancellato un file da un repository e ora voglio rimetterlo. Il meglio che riesco a capire è:

  • aggiornamento alla revisione prima dell'eliminazione
  • copia i file altrove
  • aggiornamento alla testa
  • copia i file indietro
  • aggiungili
  • commettere

Ha solo un cattivo odore e perde tutta la storia per l'avvio. Deve esserci un modo migliore per farlo. Ho già cercato in The SVN Book ma non ho trovato nulla e ora sto guardando l'elenco dei tag SVN.


4
Sicuramente la risposta di tukushan è la risposta diretta corretta alla tua domanda e dovrebbe essere accettata?
James McCormack,

@JamesMcCormack: vedi NB nella sua risposta.
BCS

2
Un consiglio, se hai cancellato il file e non hai ancora eseguito il commit della modifica, fai semplicemente clic destro e l'aggiornamento lo ripristinerà.
Hammad Khan

Risposte:


57

Usa svn merge:

svn merge -c -[rev num that deleted the file] http://<path to repository>

Quindi un esempio:

svn merge -c -12345 https://svn.mysite.com/svn/repo/project/trunk
             ^ The negative is important

Per TortoiseSVN (penso ...)

  • Fare clic con il tasto destro in Explorer, andare su TortoiseSVN -> Unisci ...
  • Assicurati che "Unisci un intervallo di revisioni" sia selezionato, fai clic su Avanti
  • Nella casella di testo "Intervallo di revisione da unire", specifica la revisione che ha rimosso il file
  • Seleziona la casella di controllo "Unione inversa", fai clic su Avanti
  • Fare clic su Unisci

Ciò è completamente non testato, tuttavia.


A cura di OP : funziona sulla mia versione di TortoiseSVN (il vecchio tipo senza il pulsante successivo)

  • Vai alla cartella da cui è stata eliminata la roba
  • Fare clic con il tasto destro in Explorer, andare su TortoiseSVN -> Unisci ...
  • nella sezione Da inserire la revisione che ha effettuato l'eliminazione
  • nella sezione A inserire la revisione prima della cancellazione.
  • Fai clic su "Unisci"
  • commettere

Il trucco è fondersi all'indietro . Complimenti a sean.bright per avermi indirizzato nella giusta direzione!


Modifica: utilizziamo versioni diverse. Il metodo che ho descritto ha funzionato perfettamente con la mia versione di TortoiseSVN.

Inoltre è da notare che se ci sono state più modifiche nel commit che stai eseguendo l'unione inversa, ti consigliamo di annullare quelle altre modifiche una volta che l'unione è stata eseguita prima di eseguire il commit. Se non lo fai, anche quelle modifiche extra verranno annullate.


Sono su Windows e non ho una versione CLI di SVN. sai come farlo fare a ortoiseSVN?
BCS

Tortoise ha "unisci" nel menu di scelta rapida. Dispone di caselle da compilare per il rev. Anche "Dry Run" per vedere se hai impostato bene. E ricorda, il risultato non conta finché non lo commetti. Puoi tornare indietro se tutto va in tilt.
gbarry

Direi che l'OP ha una versione precedente di Tortoise. Quello più recente ha una finestra di dialogo di unione (inferiore) diversa
1800 INFORMAZIONI

Devo ancora vedere QUALSIASI sistema di unione che non abbia fatto schifo. Testo, file, directory, documenti di Word, schifo. Penso che non sia un problema risolvibile. Le cose di OTOH possono fare più o meno schifo. :)
BCS

1
Se si ripristinano diversi file e poi si ripristina uno dei ripristini, ciò è annullato. Ahia! Penso di aver appena ferito qualcosa.
BCS

176

Il problema con l'esecuzione di un'unione svn come suggerito da Sean Bright è che reintroduce altre modifiche apportate nella stessa revisione dell'eliminazione. Una copia svn è un'operazione più mirata che interesserà solo i file eliminati.

Usando Tortoise SVN puoi resuscitare un file che è stato cancellato dalla tua directory di copia di lavoro e dalle successive revisioni SVN, tramite una copia svn come segue:

  • Accedere alla cartella della copia di lavoro che in precedenza conteneva il file.
  • Fare clic con il tasto destro sulla cartella in Explorer, andare su TortoiseSVN -> Mostra registro.
  • Fare clic con il tasto destro sul numero di revisione appena prima della revisione che ha eliminato il file e selezionare "Sfoglia repository".
  • Fare clic con il tasto destro sul file eliminato e selezionare "Copia nella copia di lavoro ..." e salvare.

Il file eliminato sarà ora nella cartella della copia di lavoro. Per aggiungerlo nuovamente a SVN, fare clic con il pulsante destro del mouse sul file ripristinato e selezionare SVN Commit.

NB: questo metodo preserverà la cronologia precedente del file ripristinato, tuttavia per vedere la cronologia precedente nel registro di TortoiseSVN è necessario assicurarsi che "Interrompi in copia / rinomina" sia deselezionato nella finestra di dialogo Messaggi di registro.


26
Questa operazione può essere eseguita anche direttamente sul server, utile se i file o la cartella eliminati erano abbastanza grandi: svn cp -r 1993 http://example.com/svn/trunk/path@1993 http://example.com/svn/trunk/path
Craig

Questo è il modo giusto per farlo. Ho appena provato con TortoiseSVN 1.8.1 e funziona come consigliato.
Dott.Gianluigi Zane Zanettini

Perfetto!! Semplice ed efficace. Grazie per la soluzione
Hunter

Questo metodo mi ha reso molto più semplice ripristinare un file in un ramo figlio che era stato cancellato dal suo ramo genitore. Forse c'era un modo per farlo merge, ma non l'ho capito.
arr_sea

"Appena prima" nel passaggio 3 è importante. Nel passaggio 4, Tortoise ha continuato a lamentarsi del fatto che il file esiste già, anche se l'avevo eliminato utilizzando una cancellazione di Windows. Ho dovuto prima aggiornare la mia copia di lavoro. (Il mio collega aveva cancellato diversi file utilizzando Tortoise delete, quindi ha eseguito il commit delle modifiche.) TortoiseSVN 1.8.1.
leqid


16

Utilizzare la funzionalità di copia SVN tartaruga per annullare le modifiche confermate:

  1. Fare clic con il pulsante destro del mouse sulla cartella principale che contiene i file / la cartella eliminati
  2. Seleziona "mostra registro"
  3. Selezionare e fare clic con il tasto destro sulla versione prima della quale sono state apportate le modifiche / cancellate
  4. Seleziona "sfoglia repository"
  5. Seleziona il file / cartella che deve essere ripristinato e fai clic con il tasto destro
  6. Seleziona "copia in" che copierà i file / cartelle nella revisione principale

spero che aiuti


13

Mi sembra sempre di usare la copia svn come operazione del server, quindi non sono sicuro che funzioni con due percorsi di lavoro.

Ecco un esempio di ripristino di un file eliminato in una copia di lavoro locale del progetto:

svn copy https://repos/project/modules/module.js@3502 modules/module.js

Pur essendo all'interno della directory del progetto. Funziona anche per ripristinare intere directory.


2
+1 La copia @ ha funzionato. La copia -r non sembra funzionare per l'utilizzo di CollabNet svn 1.6.17 in Mac OSX.
Grigio

2
Anche la revisione utilizzata dovrebbe essere la revisione subito prima della cancellazione.
Grey

6

Se stai usando Tortoise SVN, dovresti essere in grado di ripristinare le modifiche da quella revisione nella tua copia di lavoro (eseguendo effettivamente un'unione inversa), quindi eseguire un altro commit per aggiungere nuovamente il file. I passaggi da seguire sono:

  1. Passa alla cartella nella copia di lavoro in cui hai eliminato il file.
  2. Vai al repo-browser.
  3. Vai alla revisione in cui hai eliminato il file.
  4. Nell'elenco delle modifiche, trova il file che hai eliminato.
  5. Fai clic con il pulsante destro del mouse sul file e vai a "Annulla modifiche da questa revisione".
  6. Questo ripristinerà il file sulla tua copia di lavoro, mantenendo la cronologia.
  7. Salva il file per aggiungerlo di nuovo nel tuo repository.

OK in quel caso, la domanda era come fare ciò che hai appena descritto. (Risposta: usa l'unione all'indietro)
BCS

1
Stavo parlando di come farlo in Tortoise SVN. Aggiungerò più dettagli.
davogones

5

Il modo più semplice in cui sono stato in grado di ripristinare i file e non perdere la cronologia delle revisioni è utilizzare la copia SVN , l'esempio di unione sopra mi sembra un modo più complesso per ottenere la stessa cosa. Perché è necessario unire quando si desidera semplicemente ripristinare una revisione?

Uso quanto segue in questo caso e funziona abbastanza bene.

svn copy -m 'restoring file' -r <rev_number_file_to_restore> http://from/file.cs http://pathTo/file.cs

Mi sembra sempre di utilizzare svn copycome operazione server, quindi non sono sicuro che funzioni con due percorsi di lavoro.


3
SVN COPY è l'approccio consigliato. La sintassi è molto semplice: svn copy [SVN URL] @ [REVISION # WHERE FILE EXISTS] [LOCAL PATH TO RESTORE TO] da visualsvn.com/support/svnbook/branchmerge/basicmerging . Ho appena usato questo da solo.
amit

Questo ha più senso per me, uso anche questo approccio
Dmitry Pashkevich

4

Con Tortoise SVN :

Se non hai ancora confermato le modifiche, puoi ripristinare la cartella principale in cui hai eliminato il file o la directory.

Se hai già eseguito il commit del file eliminato, puoi utilizzare il browser del repository, passare alla revisione in cui il file esisteva ancora e quindi utilizzare il comando Copia in ... dal menu contestuale. Immettere il percorso della copia di lavoro come destinazione e il file eliminato verrà copiato dal repository alla copia di lavoro.


simpatico. Lo proverò la prossima volta.
BCS

1

Dovresti essere in grado di controllare solo il file che desideri ripristinare. Prova qualcosa come svn co svn://your_repos/path/to/file/you/want/to/restore@revdov'è revl'ultima revisione in cui esisteva il file.

Ho dovuto fare esattamente questo poco fa e, se non ricordo male, usare l' -ropzione per svnnon ha funzionato; Ho dovuto usare la :revsintassi. (Anche se potrei averlo ricordato al contrario ...)


Non è quello che voglio. Voglio patchare nuovamente il file nel repository e far sapere a SVN che è lo stesso file.
BCS
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.