2010-02-01 6 views
91

Per inciso, utilizzando una GUI anziché CLI, ho rimosso tutti i file in un progetto Mercurial.Come posso recuperare un file rimosso in Mercurial (se non del tutto)?

Ho recuperato con Revert ok e ho perso un po 'di lavoro, che con la macchina del tempo ho potuto facilmente recuperare. Ma esiste un modo per rimuovere/annullare l'eliminazione di tali file? Trawled attraverso il manuale e su googlato ma non può vedere qualche cosa. Qualche plugin?

Probabilmente sto rispondendo alla mia domanda qui, ma i file sono stati cancellati dalla directory e non erano nella spazzatura per recuperare, quindi presumo che Remove sia irrevocabile?

p.s. So che hg forget o hg remove -Af rimuoverò senza eliminare dalla directory, ma la mia domanda ha a che fare con l'errore che ho fatto al contrario di pensare freddo l'azione attraverso.

+1

si dovrebbe essere in grado di checkout una revisione più vecchio e bene (ovviamente questo funziona solo nel caso in cui non si riscrivono la storia) – tback

+0

il il problema era che avevo commesso, fatto modifiche, R (emoved). Quindi, dopo quella sequenza si, avevo ottenuto il commit precedente, quindi tornai a quello e siccome avrò un backup sotto forma di macchina del tempo potrei ottenere le ultime modifiche da allora aggiungerle e poi commetterle. Tuttavia, se non avessi avuto un backuop, le modifiche sarebbero andate perse. – PurplePilot

+1

Domanda correlata che ti permette di cercare solo nomi di file (veloce): http://stackoverflow.com/questions/1013550/find-deleted-files-in-mercurial-repository-history-quickly –

risposta

141

In primo luogo, utilizzare hg grep per trovare il file eliminato 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 cancellato. Secondo, esegui hg revert -r <revision number> <path to deleted file> Il file eliminato sarà ora nella tua copia di lavoro, pronto per essere reimpostato.

+5

ha funzionato bene per me, grazie. cercavo la risposta a "come reintegrare un file che ho cancellato di proposito?" –

+1

esattamente quello di cui ho bisogno - grazie. – sa125

+1

grazie mille, hai salvato il mio giorno – Emil

0

È possibile annullare l'ultimo commit su un repository con hg rollback. C'è un solo livello di rollback disponibile, quindi se hai rimosso 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, questo non funziona. Sto usando 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 restituisce i file. Se contrassegno i file come R (emosso) e Rollback prima di eseguire il commit, non succede nulla. – PurplePilot

+0

Dopo aver eseguito il rollback di hg, il repo verrà eseguito il rollback, ma la directory di lavoro corrente avrà ancora le modifiche. Basta dire hg per fare un aggiornamento pulito alla revisione rolled, ora sulla punta: hg up -C. – ataylor

+1

'hg rollback' non ripristinerà il file rimosso perché la cancellazione del file non fa parte della transazione di commit. – mrucci

7

Citazione di commento:

ho creato un repository, impegna tutti, rimossi e poi impegna di nuovo

Se questo è il caso, allora non vi resta che aggiornare la directory di lavoro alla revisione precedente:

$ hg update -C -r-2 

Annotare il numero di revisione negativo. Se i file eliminati non sono nella revisione precedente, è possibile trovare utilizzando:

$ hg log -v 
0

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

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

0

Il metodo seguente è semplice e talmente stupido da non poter andare storto. Se hai cancellato o rinominato più file, sarà ok.

hg clone mydirectory mydirectory1 

e ora si inizia a mc (o Far Manager) e confrontare ciò che era contro quello che è diventato.

Al termine, è sufficiente eliminare mydirectory1.

1

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

Utilizzando Find deleted files in Mercurial repository history, quickly? + xargs + TR, ripristinare tutte le revisione -3 rimozioni al sito dalla revisione -4:

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

Si noti che questo non riuscirà se uno dei tuoi file hanno spazi nel nome; http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html non sembra avere alcun modello dove {file_dels} è diviso per \n al momento.

4

Per Mercurial 1.6 e sopra

Se si conosce il nome del file di cancellazione è possibile trovare la sua revisione facilmente con:

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

questo vi darà la revisione in strega un file chiamato NAME.c (nella radice) viene eliminato.

Quindi è possibile ripristinare il file alla revisione precedente con (come le altre risposte):

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

è possibile utilizzare un modello di nome file, invece di adattarsi a ciò che si sa, per esempio, è possibile utilizzare **/NAME.c per cerca in tutte le directory. Puoi leggere su di esso in File Name Patters. E usa questo link per conoscere il nuovo revset specifications.

3

Beh, questo ha funzionato per me.

hg revert -r revision pathToTheFile 
0

Quanto segue ha funzionato per me.

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

(opzionale, per ripristinare tutti i file)

hg revert -r <Revision Number> --all 
Problemi correlati