2012-03-09 14 views
5

Utilizzo di Mercurial, in che modo è possibile raggruppare tutti i changeset non noti in un altro repository, compresi i changeset segreti?Mercuriale: includi changeset segreti in bundle?

Conosco l'opzione per includere i changeset segreti, ma non desidero il comportamento --base. (E sembra insolitamente strano che gruppi di modifiche segrete sono sempre inclusi con --base ma sono mai inclusi senza di essa. Non dovrebbe esserci un opzione separata?)

Cordiali saluti, ho comunemente voglio fare un backup di tutti changeset che sono solo nel mio repository locale prima di tentare una riscrittura di storia potenzialmente pericolosa.

+0

Forse solo ** non riscrivere ** cronologia? –

+0

'hg help steps' - i changeset segreti non vengono né premuti, tirati o clonati –

risposta

5

Sei corretto che hg bundle escluderà normalmente i changeset segreti. Questo perché funziona solo con l'equivalente di hg outgoing e il raggruppamento di questi changeset.

così alcuni work-around:

  • Se sapere che avete almeno un progetto o di modifiche in uscita pubblica come un antenato dei tuoi gruppi di modifiche segrete, quindi è possibile utilizzare

    $ hg bundle --base "parents(outgoing())" 
    

    per ottenere quello che vuoi Il revet outgoing() sceglierà la bozza mancante e i changeset pubblici e parents(outgoing() saranno basi adatte. Dato che usi --base ottieni tutti i discendenti (pubblici, bozze e segreti) da queste basi.

  • Si potrebbe temporaneamente rendere il vostro progetto di modifiche segrete, fascio, e quindi contrassegnare segrete di nuovo:

    $ secret=$(hg log --template "{rev} " -r "secret()"); \ 
        hg phase -d $secret; \ 
        hg bundle out.hg; \ 
        hg phase -f -s $secret 
    

    (io uso Zsh e lì ho dovuto usare ${=secret} invece di $secret perché Zsh non fa . la suddivisione in espansione dei parametri di default)

    E 'importante catena di comandi con ; invece di && da quando si vorrà ripristinare le fasi indipendentemente da ciò che accade nella chiamata hg bundle - passando Parame sbagliato a hg bundle non dovrebbe significare che perdi tutte le informazioni sui changeset segreti. Nota anche che poiché i changeset segreti hanno solo discendenti segreti, non c'è perdita di informazioni con questa tecnica.

    È possibile trasformare questo in un alias di shell:

    [alias] 
    bundle-all = !secret=$(hg log --template "{rev} " -r "secret()"); 
          hg phase -d $secret; 
          hg bundle [email protected]; 
          hg phase -f -s $secret 
    

    Il [email protected] si espande da Mercurial prima che l'alias è invocata e questo consente di inserire gli argomenti necessari per hg bundle.

Nota che le informazioni di fase non possono essere memorizzate in bundle: il formato di bundle non è stato modificato per adattarlo.

1

Se sai che c'è almeno un changeset pubblico, è possibile utilizzare questo:

hg bundle -r "not public()" --base public() 

OTOH, che non funziona se non ci sono gruppi di modifiche pubblici, usare questo invece:

hg bundle -r "not public()" --base null 

Il problema con la risposta di Martin è che si basa su outgoing, che a sua volta si basa su una connessione diretta al repository push. Se non si dispone sempre di una connessione Internet a tale repo, questi metodi funzionano bene per me. È anche un po 'più semplice della fase dance.

Un test se esistono changeset comuni per catturare l'output di:

hg log -r public() -l 1 --template "{rev}" 

e testare la sua lunghezza, o la presenza di [0-9].