Con Mercurial, come posso & # 8220; comprimere & # 8221; una serie di changeset in uno prima di spingere?

StackOverflow https://stackoverflow.com/questions/1200691

Domanda

Diciamo che ho un repository Mercurial locale e remoto. Ora inizio a lavorare su una funzione. Ci lavoro e, quando penso che sia finito, commetto il changeset. Provandolo un po 'di più, trovo che potrei migliorare ulteriormente questa funzione modificando qualcosa nel codice. Apporto il cambiamento e mi impegno. 20 minuti dopo, trovo che c'è un bug in questa nuova funzionalità, quindi lo risolvo e lo commetto anche.

Ora ho 3 changeset che vorrei davvero inviare al repository remoto come un changeset con il messaggio "Implementazione della funzione X", ad esempio.

Come posso farlo senza troppi problemi? Credo che potrei farlo con le patch, ma sembra un sacco di lavoro.

È stato utile?

Soluzione

Che ne dici della Estensione di compressione ?

Altri suggerimenti

L'estensione histedit è esattamente ciò che stai cercando .

hg histedit -o

o

hg histedit --outgoing

mostrerà un elenco dei changeset in uscita. Dall'elenco puoi

  • Piega 2 o più changeset creando un singolo changeset
  • Elimina i changeset rimuovendoli dalla cronologia
  • Riordina i changeset come preferisci.

histedit ti chiederà il nuovo messaggio di commit dei changeset piegati che di default ai due messaggi con " \ n *** \ n " separandoli.

Puoi anche ottenere risultati simili usando l'estensione mq, ma è molto più difficile.

Puoi anche usare l'estensione di compressione per fare semplicemente il fold, ma non fornisce un'interfaccia utente così piacevole e non fornisce un modo per modificare il messaggio di commit risultante. La modifica del messaggio di commit risultante consente anche di ripulire il messaggio finale, che è qualcosa che finisco sempre per utilizzare.

Sì, puoi farlo con le patch: Supponiamo che il tuo lavoro sia in changeset da 100 a 110, incluso

  1. Crea una patch:

    % hg export -o mypatch 100: 110 --git

  2. Aggiorna a 99:

    % hg update 99

  3. Applica la patch con --no-commit (altrimenti otterrai tutti i cambiamenti):

    % hg import --no-commit mypatch

  4. Salva tutte le modifiche contemporaneamente:

    % hg commit

  5. Ora hai due teste (110 e 111) che dovrebbero essere equivalenti in termini di file che producono nella tua directory di lavoro - forse li differisci per sanità mentale prima di eliminare quelli vecchi:

    % hg strip 100

OK, ora che ho scritto tutto, sembra molto lungo, ma dopo averlo fatto un sacco di volte da solo, non trovo che sia troppo noioso ...

Se stai usando TortoiseHg, puoi semplicemente selezionare due revisioni (usa CTRL per selezionare quelle non successive), fai clic destro e seleziona " Comprimi cronologia " .

Dopodiché otterrai un nuovo elenco di modifiche nella nuova testa a partire dalla prima modifica selezionata in precedenza, conterrà tutti gli elenchi di modifiche discendenti tra quelli selezionati.

Puoi semplicemente eliminare le vecchie liste di modifiche se non ti servono più: usa MQ per esso. Ancora una volta, in TortoiseHg: fai clic con il pulsante destro del mouse sul primo elenco di modifiche che deve essere rimosso con tutti i suoi discendenti, " Modifica cronologia - > Striscia ".

Il mio metodo preferito di usare mq per questo pieghevole è usare TortoiseHg come descritto qui . Tuttavia, può essere facilmente eseguito dalla riga di comando in questo modo:

hg qimport -r <first>:<last> 
    -- where <first> and <last> are the first and last changesets 
    -- in the range of revisions you want to collapse

hg qpop <first>.diff
    -- remove all except for the first patch from the queue
    -- note: mq names patches <#>.diff when it imports them, so we're using that here

hg qfold <next>.diff
    -- where <next> is <first>+1, then <first>+2, until you've reached <last>

hg qfinish -a
    -- apply the folded changeset back into the repository

(Potrebbe esserci un modo migliore per eseguire il passaggio qfold, ma non ne sono consapevole, poiché di solito utilizzo TortoiseHg per tale operazione.)

All'inizio sembra un po 'complicato, ma una volta che hai iniziato a usare mq, è abbastanza semplice e naturale - inoltre puoi fare qualsiasi altra cosa con mq che può essere molto utile!

hg collapse e hg histedit sono i modi migliori. O meglio, sarebbe il modo migliore, se funzionassero in modo affidabile ... Ho avuto histedit in crash con un dump dello stack in tre minuti. Collapse non è molto meglio.

Ho pensato di condividere altri due BKM:

  1. hg rebase --collapse

    Questa estensione è distribuita con Mercurial. Non ho ancora avuto problemi con esso. Potrebbe essere necessario giocare ad alcuni giochi per aggirare le limitazioni di hg rebase - in pratica, non gli piace rifare a un antenato sullo stesso ramo, nominato o predefinito, anche se lo consente se si ripete tra rami (nominati).

  2. Sposta il repository ( foo / .hg ) nella directory di lavoro ( bar ) e nei suoi file. Non viceversa.

Alcune persone hanno parlato della creazione di due alberi clone e della copia dei file tra di loro. O patch tra di loro. Invece, è più facile spostare le directory .hg .

hg clone project work
... lots of edits
... hg pull, merge, resolve
hg clone project, clean
mv work/.hg .hg.work
mv clean/.hg work/.hg
cd work
... if necessary, pull, nerge, reconcile - but that would only happen because of a race
hg push

Funziona fintanto che i veri repository, gli alberi .hg , sono indipendenti dalla directory di lavoro e dai suoi file.

Se non sono indipendenti ...

Non ho mai usato Mercurial, ma suona molto come quello di cui parlava Martin Fowler sul suo blog non molto tempo fa:

http://martinfowler.com/bliki/MercurialSquashCommit.html

Perché non solo il comando hg strip --keep ?

Quindi puoi eseguire il commit di tutte le modifiche come un unico commit.

HistEdit farà quello che vuoi, ma probabilmente è eccessivo. Se l'unica cosa di cui hai bisogno è piegare insieme alcuni changeset, Collapse Extension farà il lavoro.

Supponi di avere due QUESTO e CHE non pubblicati in Mercurial e come loro di unirsi in un unico commit nel punto QUESTO :

... --> THIS --> ... --> THAT --> ... --> LAST

Verifica che i tuoi commit non siano pubblicati ::

$ hg glog -r "draft() & ($THIS | $THAT)"

Aggiorna a LAST commit ::

$ hg up

e l'importazione impegna fino a QUESTO in MQ ::

$ hg qimport $THIS::.

Annulla l'applicazione di tutte le patch e applica solo prima QUESTO ::

$ hg qpop -a
$ hg qpush
$ hg qapplied
... THIS ...

Partecipa con THAT ::

$ hg qfold $THATNAME

NOTA Per trovare il nome THATNAME usa ::

$ hg qseries

Applica tutte le patch e spostale nella cronologia del repository ::

$ hg qpush -a
$ hg qfinish -a

Il mio post sul blog sull'argomento è Partecipare a due commit in Mercurial .

Sì, strip --keep funziona per la domanda dell'autore. Ma era leggermente diverso dagli altri, ad esempio, se hai la versione da 1 a 30 ma vuoi solo comprimere la versione 12-15. Altre soluzioni funzionano ma non strip --keep .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top