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.