Come posso recuperare un file rimosso in Mercurial (se non del tutto)?


100

Accidentalmente, utilizzando una GUI invece della CLI, ho rimosso ogni file in un progetto Mercurial.

Ho recuperato con Revert ok e ho perso un po 'di lavoro, che visto che ho la macchina del tempo potrei facilmente recuperare. Ma esiste un modo per rimuovere / ripristinare tali file? Ho controllato il manuale e cercato su Google ma non riesco a vedere nulla. Eventuali plugin?

Probabilmente sto rispondendo alla mia domanda qui, ma i file erano spariti dalla directory e non erano nel cestino per il ripristino, quindi presumo che Remove sia irrevocabile?

ps lo so hg forgeto hg remove -Aflo rimuoverò senza eliminare dalla directory, ma la mia domanda ha a che fare con l'errore che ho fatto anziché con il pensiero freddo dell'azione.


1
dovresti essere in grado di effettuare il checkout di una revisione precedente e stare bene (ovviamente funziona solo nel caso in cui non hai riscritto la cronologia)
tback

il problema era che avevo commesso, apportato modifiche, R (emoved). Quindi, dopo quella sequenza sì, avevo ottenuto il commit precedente, quindi sono tornato a quello e poiché ho il backup sotto forma di macchina del tempo ho potuto ottenere le ultime modifiche da quindi aggiungerle e quindi eseguire il commit. Tuttavia se non avessi avuto un backuop le modifiche sarebbero andate perse.
PurplePilot

1
Domanda correlata che ti consente di cercare solo nomi di file (veloce): stackoverflow.com/questions/1013550/…
Michael Pryor

Risposte:


152

In primo luogo, utilizzare hg grepper trovare il file eliminato che si desidera recuperare. L'output di questo comando ti mostrerà l'ultima revisione per la quale il file era presente e il percorso del file eliminato. Secondo, esegui. hg revert -r <revision number> <path to deleted file> Il file cancellato sarà ora nella tua copia di lavoro, pronto per essere reinserito in testa.


5
ha funzionato bene per me, grazie. stava cercando la risposta a "come faccio a ripristinare un file che ho eliminato di proposito?"
nc.

da eclipse questo può essere fatto facendo clic con il pulsante destro del mouse sul file Seleziona squadra -> Ripristina
Emil

3
Un altro modo per trovare la revisione contenente il file èhg log -I '**file.ext'
mpen

2
Solo un FYI: vuoi il numero di revisione del commit che ha ancora il file, NON quello che lo ha rimosso!
Lukas Knuth

8

Citazione dal commento:

Ho impostato un repository, ho eseguito il commit di tutto, rimosso e quindi eseguito nuovamente il commit

Se questo è il caso, devi solo aggiornare la directory di lavoro alla revisione precedente:

$ hg update -C -r-2

Annotare il numero di revisione negativo. Se i file che hai eliminato non sono nella revisione precedente, puoi trovarli utilizzando:

$ hg log -v

5

Bene, questo ha funzionato per me.

hg revert -r revision pathToTheFile

4

Per Mercurial 1.6 e versioni successive

Se conosci il nome del file cancellato puoi trovare facilmente la sua revisione con:

hg log -r "removes('NAME.c')"

Questo ti darà la revisione in cui un file chiamato NAME.c (nella root) viene cancellato.

Quindi puoi ripristinare il file alla revisione precedente con (come altre risposte):

hg revert -r <revision number> <path to deleted file>

Puoi invece usare un modello di nome file per adattarlo a ciò che conosci, ad esempio puoi usare **/NAME.cper cercare in tutte le directory. Puoi leggere a riguardo in Schemi nome file . E usa questo link per conoscere le nuove specifiche del revset .


1

Un'aggiunta alla risposta accettata: è più veloce se vuoi annullare tutte le rimozioni in un commit. Ho cancellato una cartella di grandi dimensioni con alcune centinaia di file e l'ho fatto hg addremove, il che non era affatto il mio intento, quindi ho dovuto annullare tutte quelle eliminazioni.

Usare Trova file cancellati nella cronologia del repository Mercurial, velocemente? + xargs + tr, ripristina tutte le rimozioni di revisione -3 alla versione dalla revisione -4:

hg log -r -3 --template "{rev}: {file_dels}\n" | tr ' ' '\n' | xargs hg revert -r -4 

Nota che questo fallirà se uno qualsiasi dei tuoi file ha spazi nel nome; http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html non sembra avere alcun modello in cui {file_dels}è suddiviso \nal momento.


0

Puoi annullare l'ultimo commit su un repo con hg rollback. È disponibile un solo livello di rollback, quindi se hai eseguito la rimozione con più di un commit, questo non annullerà completamente la tua modifica. Funziona solo sul tuo repository locale, quindi se hai spinto non sarai in grado di annullarlo nel repository remoto.


1
No, non funziona. Utilizzo un Mac con Mercurial Distributed SCM (versione 1.4.1 + 20091201). Ho impostato un repository, ho eseguito il commit di tutto, rimosso e quindi eseguito nuovamente il commit, ma questo riporta solo un elenco dei file contrassegnati come R (emoved) ma in realtà non ripristina i file. Se contrassegno i file come R (emoved) e Rollback prima di eseguire il commit non succede nulla.
PurplePilot

Dopo aver eseguito il rollback hg, il repository verrà ripristinato, ma la directory di lavoro corrente avrà ancora le modifiche. Dì a hg di eseguire un aggiornamento pulito alla revisione annullata, ora in punta: hg up -C.
ataylor

1
hg rollbacknon ripristinerà il file rimosso perché l'eliminazione del file non fa parte della transazione di commit.
mrucci

4
Giusto. Se stai cercando di ottenere modifiche che non sono state salvate prima della rimozione, vengono perse.
ataylor

0

È possibile rimuovere le revisioni confermate utilizzando il hg stripcomando, fornito dall'estensione mq (Mercurial Queues). Questo dovrebbe restituirti i tuoi file.

Fai un backup prima di provarlo, perché altererà il database dei changeset di Mercurial.


0

Il metodo seguente è semplice e così stupido che non può andare storto. Se hai cancellato o rinominato più file, andrà bene.

hg clone mydirectory mydirectory1

e ora avvii mc (o Far Manager) e confronti quello che era con quello che è diventato.

quando è finito, elimina mydirectory1.


0

Quanto segue ha funzionato per me.

hg revert -r <Revision Number> <File Name>

(Facoltativo, per ripristinare tutti i file)

hg revert -r <Revision Number> --all
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.