Mercurial:Includere segreto insiemi di modifiche in bundle?
-
10-12-2019 - |
Domanda
Utilizzando Mercurial, come posso raggruppare tutti gli insiemi di modifiche non noto per essere in un altro repository, tra segreto insiemi di modifiche?
So bundle
's --base
opzione avviene per includere segreto insiemi di modifiche, ma non voglio che il --base
il comportamento.(E sembra insolitamente strano che segreto insiemi di modifiche sono sempre incluso --base
ma sono mai incluso senza di essa.Non dovrebbe esserci una opzione separata?)
FYI, ho comunemente vuole fare un backup di tutti gli insiemi di modifiche che sono solo nel mio repository locale prima di tentare una potenzialmente pericolosa riscrivere la storia.
Soluzione
È giusto che hg bundle
normalmente escludere segreto insiemi di modifiche.Questo è perché è solo in esecuzione, l'equivalente di hg outgoing
e bundling questi insiemi di modifiche.
Così alcune soluzioni:
Se sapete di avere almeno un progetto pubblico o in uscita changeset come un antenato del tuo segreto insiemi di modifiche, quindi è possibile utilizzare
$ hg bundle --base "parents(outgoing())"
per ottenere quello che vuoi.Il
outgoing()
revset pick mancanti progetto e pubblico insiemi di modifiche eparents(outgoing()
sarà adatto basi.Dal momento che si utilizza--base
è possibile ottenere tutti i discendenti (pubblico, bozza, e segreto) da queste basi.Si potrebbe rendere temporaneamente il tuo segreto insiemi di modifiche di progetto, bundle e le contrassegna segreto:
$ secret=$(hg log --template "{rev} " -r "secret()"); \ hg phase -d $secret; \ hg bundle out.hg; \ hg phase -f -s $secret
(Io uso Zsh e ci ho dovuto usare
${=secret}
invece di$secret
perché Zsh non fare parola suddivisione in espansione di parametro impostazione predefinita.)È importante catena di comandi con
;
invece di&&
dal momento che si desidera ripristinare le fasi indipendentemente da ciò che accade nelhg bundle
chiamata di passaggio di parametri errati perhg bundle
non deve significare che si perde tutte le informazioni su il segreto insiemi di modifiche.Nota anche che dal segreto changeset solo segreto discendenti, non c'è perdita di informazioni con questa tecnica.È possibile trasformare questo in un guscio alias:
[alias] bundle-all = !secret=$(hg log --template "{rev} " -r "secret()"); hg phase -d $secret; hg bundle $@; hg phase -f -s $secret
Il
$@
si tratta dell'espansione Mercurial prima l'alias viene richiamato e questo consente di inserire gli argomenti necessari perhg bundle
.
Si noti che la fase di informazione non possono essere memorizzati in fasci — il bundle formato non è stato modificato per adattarlo.
Altri suggerimenti
Se sai che c'è almeno un pubblico di modifiche, è possibile utilizzare questo:
hg bundle -r "not public()" --base public()
OTOH, che non funziona se non ci sono pubblici insiemi di modifiche, usa invece questo:
hg bundle -r "not public()" --base null
Il problema con Martin risposta è che si basa su di uscita, che a sua volta si basa su una connessione diretta a spingere repo.Se non si dispone sempre di una connessione internet per che repo, questi metodi funzionano bene per me.E 'anche un po' più semplice rispetto alla prima fase della danza.
Un test per capire se ci sono eventuali pubblico insiemi di modifiche è quello di catturare l'output di:
hg log -r public() -l 1 --template "{rev}"
e per testare la sua lunghezza, o la presenza di [0-9].