Elimina tutti i changeset locali e torna all'albero


95

Sto usando Mercurial e sono finito in un pasticcio terribile a livello locale, con tre teste. Non posso spingere e voglio solo eliminare tutte le mie modifiche locali e commit e ricominciare con un codice totalmente pulito e una cronologia pulita.

In altre parole, voglio finire con (a) esattamente lo stesso codice che esiste localmente nella punta del ramo remoto e (b) nessuna cronologia di eventuali commit locali.

So che hg update -Csovrascrive eventuali modifiche locali. Ma come si eliminano i commit locali?

Per essere chiari, non ho alcun interesse a preservare il lavoro che ho svolto a livello locale. Voglio solo il modo più semplice per tornare a una cassa locale totalmente pulita.


Risposte:


129

Quando il modo più semplice (nuovo hg clone) non è pratico, utilizzo hg strip:

% hg outgoing -l 1
% hg strip $rev # replace $rev with the revision number from outgoing

Ripeti finché non hg outgoingrimane tranquillo. Nota che hg strip $revcancella $reve tutti i suoi discendenti.

Nota che potresti dover prima abilitare stripnelle impostazioni di Mercurial .

PS: un approccio ancora più intelligente è usare il linguaggio revset e fare:

% hg strip 'roots(outgoing())'

1
Grazie! Sono finito in una situazione che si è risolta perfettamente, senza alcun problema.
eswald

1
Questo mi ha salvato dalle grandi correzioni sopra, molto semplice, grazie!
David C

3
Se qualcuno ha problemi a mettersi hg strip 'roots(outgoing())'al lavoro a causa del mancato riconoscimento 'roots(outgoing())'. Sono stato in grado di farlo funzionare hg strip "roots(outgoing())".
jsea

@SombreErmine in cmd.exe, yes.
solo qualcuno il

21

Ti consigliamo di creare un clone locale in cui conservare solo i changeset che sono presenti anche nel repository remoto. Usa TortoiseHg , hg logo simile per capire quale delle tue revisioni è l'ultima revisione che non hai fatto (quella prima che iniziasse il pasticcio). L'uso hg outgoingpuò aiutare qui: elencherà tutti i changeset che hai fatto - scegli un numero di revisione prima di uno qualsiasi di questi.

Se viene richiamata la revisione di destinazione e viene richiamato goodil clone foo, eseguire:

hg clone -r good foo foo-clean

Questa sarà un'operazione veloce e locale: non c'è motivo di scaricare di nuovo tutto . Il foo-cleanclone conterrà solo i changeset fino alla revisione good. È ora possibile sostituire foo-clean/.hg/hgrccon foo/.hg/hgrcper preservare le impostazioni locali del repository come il percorso push / pull predefinito.

Quando si è soddisfatti che foo-cleanha tutto il necessario da foo, quindi è sufficiente eliminare fooe rinominare foo-cleana foo. Fai un hg pullper ottenere nuovi changeset dal repository remoto nel tuo clone e continua normalmente.


Se nessuno ha inviato nuovi changeset al repository remoto, allora è molto semplice determinare quale revisione vuoi usare come goodsopra: hg id defaultti dirà l'ID del suggerimento nel repository remoto.


Sto avendo la stessa situazione, ma ho anche molti file nella directory del repository ma sono in hgignore. Non è possibile installare hg strip e vorrei eliminare i commit locali senza sostituire l'intero clone. Qualche idea? - Ah! Se non ho aggiunto alcun file, dovrei essere in grado di copiare semplicemente l'altro clone nella mia vecchia directory !?
Peteter

Fai attenzione con questo metodo se hai più rami, però. La clonazione fino a una revisione specificata ottiene solo i changeset sul ramo della revisione specificata. Potrebbe quindi essere necessario eseguire hg pull -rl'ultima "buona" revisione di ogni ramo aggiuntivo.
Yitz

9

Ok. Quindi elimina tutte le cose locali, hg initil nuovo repository locale e hg pulll'ultimo suggerimento che hai. Non dimenticare di farlo hg updatedopo.


Grazie. Quando dici "elimina tutte le cose locali", intendi eliminare l'intero repository o solo le mie modifiche? Cosa fa hg init (ho cercato su Google ma non riesco a vedere una semplice spiegazione) e devo usare qualche flag con esso? Eliminerà cose come le mie preferenze .hgrc di Mercurial?
Richard

Aggiornamento: se cancello tutto nella directory principale del progetto, quindi digito 'hg init', ottengo 'abort: repository. esiste già!'. Devo configurarmi e lavorare da una nuova directory? Preferirei di no, se possibile ... sicuramente ci deve essere un modo semplice per uccidere tutto ciò che ho fatto a livello locale ?!
Richard

Sì, elimina tutto compreso tutto il materiale del repository. Inizia da una nuova cartella pulita. Le tue preferenze puoi salvare nel file di backup e quindi ripristinarle nel nuovo repository che crei con hg init reponame. Dettagli su init e cose del genere: hgbook.red-bean.com/read/mercurial-in-daily-use.html
alemjerus

6
alemjerus: hg init+ hg pull= hg cloneLa differenza è che hg clonefa un bel .hg/hgrcfile per te e che hg cloneutilizzerà collegamenti fisici per risparmiare spazio durante la clonazione sullo stesso filesystem.
Martin Geisler,

Richard: L'output di hg help initè qui: selenic.com/mercurial/hg.1.html#init Ma forse è troppo conciso? Si prega di inviare una mail alla nostra mailinglist se hai bisogno di ulteriore aiuto! Vedi: mercurial.selenic.com/wiki/MailingLists
Martin Geisler

5

Puoi usare

hg strip revision

per uccidere qualsiasi revisione e la sua sottostruttura nel tuo repository locale.

https://www.mercurial-scm.org/wiki/Strip

Ma non provare a usarlo per qualcosa che è già stato spinto.


Puoi usarlo su una revisione pubblica, ma se lo tiri di nuovo, apparirà di nuovo. (hg strip funziona solo con il repository locale.)
Mike Rosoft

2

Elimina tutto ciò che hai sul tuo sistema locale e ri-clona il repository remoto.


2
hg strip `hg out --template" {rev} {author} \ n "| grep YOUR_AUTHOR_NAME | tagliare -d "" -f 1`

fa il trucco per me.

Elimina tutte le revisioni che non vengono inviate al repository predefinito che vengono create con il nome dell'autore.

È inoltre possibile utilizzare questo stile per fare in modo che non venga verificato con il repository predefinito ma con un altro repository

hg strip `hg out OTHER_REPO_ALIAS --template" {rev} {autore} \ n "| grep YOUR_AUTHOR_NAME | tagliare -d "" -f 1`

0

Se stai usando TortoiseHg, un modo semplice per uscire da un (piccolo) pasticcio è prima aggiornare all'ultima revisione, quindi selezionare i tuoi changeset e avviare "unisci con locale". Quando viene visualizzata la finestra di dialogo di unione, fai semplicemente clic sulla piccola icona "+" per rivelare alcune opzioni extra, una delle quali è "scarta i changeset dalla revisione della destinazione di unione (altra)". In questo modo i tuoi changeset saranno ancora nel repository e verranno inviati, ma non avranno effetto, perché verranno scartati nell'unione. Se hai molti changeset che coprono molte teste, potresti non voler inquinare il repository in questo modo, ma è una soluzione semplice e vale la pena considerare se i changeset che stai scartando contengono dati a cui potresti voler fare riferimento in seguito.

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.