2009-07-08 22 views
294

Voglio che mercurial rimuova diversi file dallo stato corrente del repository. Tuttavia, voglio che i file esistano nella cronologia precedente.Qual è la differenza tra hg forget e hg remove?

In che modo differiscono forget e remove e possono fare ciò che voglio?

+25

Non preoccupatevi, non è possibile rimuovere un file dalla cronologia precedente in Mercurial - la cronologia è generalmente immutabile a meno che non si inizi a utilizzare le estensioni. –

risposta

326

'hg forget' è solo una scorciatoia per 'hg remove -Af'. Dal 'hg remove' aiuto:

... e -af può essere usato per rimuovere i file dalla prossima revisione senza eliminarli dalla directory di lavoro.

Linea di fondo: 'remove' elimina il file dalla copia di lavoro su disco (a meno che non si usi -Af) e 'forget' non lo fa.

+7

"hg forget" viene reintrodotto in Mercurial 1.3 come un modo più semplice per eseguire "hg remove -Af". Pianifica il file per la cancellazione senza rimuoverlo dalla copia di lavoro. –

+5

Felice di sentirlo. 'remove -Af' (e l'intera tabella di opzioni nella pagina di aiuto 'remove') è/era follia. –

+30

@ Ry4an: Seriamente, era ridicolo. Ho contribuito con la patch che ha reintrodotto "dimenticare". Quando lo stavo realizzando, mi sono reso conto che - Se il codice era completamente logico, dal punto di vista dell'utente era completamente ridicolo. –

26

Dalla documentazione, è possibile apparentemente utilizzare entrambi i comandi per mantenere il file nella cronologia del progetto. Sembra che tu voglia rimuovere, poiché cancella anche il file dalla directory di lavoro.

Dal libro Mercurial a http://hgbook.red-bean.com/read/:

rimozione di un file non influisce la sua storia . È importante per capire che la rimozione di un file ha solo due effetti. Rimuove la versione corrente del file dalla directory di lavoro . Arresta Mercurial dal rilevamento delle modifiche al file, dall'ora del prossimo commit. La rimozione di un file non comporta in alcun modo modificare la cronologia del file.

La pagina man hg (1) dice questo circa dimenticare:

Segna i file specificati in modo che si più essere monitorati dopo il prossimo commit. Rimuove solo i file da il ramo corrente, non dall'intera cronologia del progetto e non li elimina dalla directory funzionante. .

E questo di rimuovere:

Pianificare i file indicati per rimozione dal repository. Questo rimuove solo i file dal ramo corrente , non dall'intera cronologia del progetto .

37

Il modo migliore per mettere è che hg forget è identico-hg removetranne che lascia i file indietro nella vostra copia di lavoro. I file vengono lasciati come file non tracciati e possono ora essere ignorati con un pattern in .hgignore.

In altre parole, io Non posso dire se è stato utilizzatohg forget o hg remove quando tiro da voi. Un file che hai eseguito hg forget su sarà cancellato quando aggiorno a quel changeset - proprio come se tu avessi usato hg remove invece.

3

Se si utilizza "hg remove b" contro un file con lo status di "A", il che significa che è stato aggiunto, ma non commesso, Mercurial risponderà:

not removing b: file has been marked for add (use forget to undo) 

Questa risposta è una chiara spiegazione della differenza tra remove e dimentica.

La mia comprensione è che "hg forget" è per l'annullamento di un file aggiunto ma non impegnato in modo che non sia tracciato dal controllo della versione; mentre "hg remove" serve per estrarre un file salvato dal controllo di versione.

Questo thread ha un esempio per l'utilizzo di hg remove contro file di 7 diversi tipi di stato.

1

Un file può essere rintracciato o no, si utilizza hg aggiungere per tracciare un file e rimuovere hg o hg dimenticare di non-seguirlo. Usando hg rimuovi senza i flag elimineranno entrambi il file e disattivalo, hg dimenticando sarà semplicemente disattivalo senza eliminarlo.

+3

Non so perché hai sentito il bisogno di aggiungere questa citazione quando l'uomo stesso ha già suonato, ma hey, qualunque cosa faccia galleggiare la tua barca. –