Mercurial: posso rinominare un ramo?


205

Ora abbiamo un ramo "stiging", in cui la "messa in scena" sembra essere una misura semantica molto migliore. Qual è una buona strategia per gestirlo?

Risposte:


224

Aggiorna al stigingramo e creane uno nuovo. Quindi chiudi il vecchio ramo.

In sintesi:

hg update stiging
hg branch staging
hg commit -m"Changing stiging branch to staging."
hg update stiging
hg commit --close-branch -m"This was a typo; use staging instead."
hg push --new-branch

1
Questo è il modo migliore per farlo che ho trovato. La chiusura del ramo impedisce ad altri di usarlo accidentalmente perché non viene visualizzato nell'output di "rami hg". Ti consente comunque di accedervi in ​​seguito se conosci il nome.
Utensile,

2
Mercurial consentirà di riutilizzare il nome di un ramo chiuso? Ad esempio, se si dispone di un ramo v3, è possibile utilizzare la tecnica sopra per rinominarlo in v4 e quindi eseguire il fork di un nuovo ramo v3 nonostante abbia lasciato un v3 chiuso?
Joshua Goldberg,

4
@JoshuaGoldberg, 3noch è sbagliato. Mercurial ti permetterà di riutilizzare il nome di un ramo chiuso se lo usi --force. Ad esempio: hg branch --force v3. Ciò comporterà l' hg update v3aggiornamento al nuovo v3ramo, come desiderato.
Gili,

2
ha confermato il commento di @Gili con hg help branch: "- force imposta il nome del ramo anche se ombreggia un ramo esistente"
Joshua Goldberg,

7
Se chiudi stigingprima della ramificazione, non ottieni una "fine libera"
max.mustermann

60

Per i lettori futuri: con l' rebaseestensione, è possibile creare un nuovo ramo con lo stesso genitore stiginge spostare l'intera cronologia del ramo su di esso, in questo modo:

hg update -r "parents(min(branch('stiging')))"
hg branch staging
hg commit
hg rebase --source "min(branch('stiging'))" --dest staging

Ciò presuppone che stigingabbia un solo genitore. Ovviamente puoi semplicemente usare numeri di revisione espliciti invece.

Nota 1: se il ramo stiginginclude le fusioni con altri rami, penso che questo li preserverà, purché staginge stigingabbia lo stesso genitore. Ma sicuramente ricontrollerei.

Nota 2: poiché questo modifica la cronologia, il vecchio ramo non scomparirà semplicemente dai repository clonati (consultare la rebasedocumentazione). A meno che tutti non possano clonare di nuovo, potrebbe non essere una soluzione molto pratica per un grande gruppo.

Nota3 / Modifica (per gentile concessione di @JasonRCoombs): ora che le fasi sono standard in mercurial, rebasesi rifiuteranno di modificare i changeset che sono già stati inviati. O prendilo in giro cambiando la fase in bozza (con hg phases), o lascia che il vecchio ramo rimanga dove si trova, e fai semplicemente una copia con nome appropriato (ad esempio, con `hg rebase --keep ').


+1 per i piccoli team in cui è possibile forzare gli utenti a clonare questa è una buona idea - o utilizzare hg convertinvece.
hochl,

5
Con le versioni tardive di Mercurial, il comando rebase fallirà con "impossibile ripristinare il changeset immutabile" se le modifiche da spostare sono "pubbliche". O forzali ad essere bozze (con fasi hg) o passa --keepal comando rebase, che copierà invece di spostare le modifiche.
Jason R. Coombs,

Al punto 4: abort: can't rebase immutable changeset 11b1e2b7dc4f. Nota che ho innestato changeets da un altro ramo in questo. Oltre a ciò, è diviso e unito gratuitamente.
Mark Jeronimus,

@Mark, dai un'occhiata alla nota 3 sopra.
alexis,

6
Invece di eseguire il commit di un changeset sul nuovo ramo e quindi di ripassarlo, puoi ometterlo e utilizzarlo .per il tuo --destvalore e il rebase assumerà automaticamente il nome del nuovo ramo.
weberc2,

16

Se hai dei changeset su di essa, dovrai usare l' estensione convert con una branchmap per rinominarla. Tutti dovranno quindi clonare il nuovo repository o rimuovere il vecchio ramo.


1
Questa è una soluzione interessante, puoi approfondire un po 'di più?
DrM,

15

Crea un nuovo ramo chiamato "messa in scena" e dimentica l'altro ...


+1 è quello che farei. I vecchi changeset avranno ancora il vecchio nome della branche, ma quelli nuovi avranno il nuovo nome del ramo.
Barjak,

6

Questo modifica la cronologia ed è solo per utenti Mercurial avanzati. Non farlo se non sai cosa significa.

Se la stimolazione è solo locale, è possibile cambiarla in stadiazione con una combinazione di innesto e striscia . Inizia aggiornando il changeset dell'antenato in cui la stiging era divergente. Creare il ramo di gestione temporanea e innestare ogni commit dalla stigmatizzazione alla stadiazione. La stadiazione dovrebbe ora essere una copia della stigmatizzazione. Infine, distruggi la stigmatizzazione eliminando il suo primo commit.

hg update {SHA-1 of the ancestor changeset}
hg branch staging
hg graft {first changeset in stiging} ... {stiging head-1} {stiging head}
hg strip {first changeset in stiging}
hg push --new-branch

1
Per il passaggio 3 puoi usarehg graft {first changeset in stiging}..{stiging head}
KCD il
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.