Mercurial: Posso renomear um ramo?

205

Agora temos um ramo "stiging", onde "staging" parece ser um ajuste semântico muito melhor. Qual é uma boa estratégia para lidar com isso?

KevDog
fonte

Respostas:

224

Atualize para a stigingramificação e crie uma nova ramificação. Depois feche o ramo antigo.

Em suma:

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
Elliot Cameron
fonte
1
Esta é a melhor maneira de fazer isso que eu encontrei. Fechar a ramificação impede que outras pessoas a usem acidentalmente porque ela não aparece na saída de "ramificações hg". Ele ainda permite acessá-lo mais tarde, se você souber o nome.
Utensílio
2
O Mercurial permitirá reutilizar o nome de uma filial fechada? Ou seja, se você possui uma ramificação v3, pode usar a técnica acima para renomeá-la para v4 e depois desbastar uma nova ramificação v3, apesar de ter deixado para trás uma v3 fechada?
27412 Joshua Goldberg
4
@JoshuaGoldberg, 3noch está errado. Mercurial irá permitir que você reutilizar o nome de um ramo fechado se você usar --force. Por exemplo: hg branch --force v3. Isso resultará na hg update v3atualização para o novo v3ramo, conforme desejado.
Gili
2
confirmou o comentário de @ Gili com o ramo de ajuda da hg: "--force define o nome do ramo, mesmo que oculte um ramo existente"
Joshua Goldberg
7
Se você fechar stigingantes de ramificação, você não obter um "ponta solta"
max.mustermann
60

Para futuros leitores: Com a rebaseextensão, você pode criar uma nova ramificação com o mesmo pai stiginge mover para ela todo o histórico da ramificação, assim:

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

Isso pressupõe que stigingtenha apenas um pai. Claro que você pode usar números de revisão explícitos.

Nota 1: Se o ramo stiginginclui mesclagens com outros ramos, acho que isso os preservará, desde que staginge stigingtenha o mesmo pai. Mas eu certamente checaria duas vezes.

Nota 2: Como isso edita o histórico, a ramificação antiga simplesmente não desaparece dos repositórios clonados (consulte a rebasedocumentação). A menos que todos possam clonar novamente, talvez não seja uma solução muito prática para um grande grupo.

Nota 3 / Edit (cortesia de @JasonRCoombs): Agora que as fases são padrão em mercurial, rebasese recusará a modificar conjuntos de alterações que já foram enviados. Ou engane-o, alterando a fase de volta para rascunho (com hg phases), ou deixe o ramo antigo permanecer onde está e faça uma cópia com o nome apropriado (por exemplo, com `hg rebase --keep ').

alexis
fonte
+1 para equipes pequenas, nas quais você pode forçar os usuários a clonar, é uma boa ideia - ou use hg convert.
Hochl
5
Nas versões posteriores do Mercurial, o comando rebase falhará com "não é possível rebater o conjunto de alterações imutável" se as alterações a serem movidas forem "públicas". Force-os a serem rascunhos (com fases hg) ou passe --keeppara o comando rebase, que copiará em vez de mover as alterações.
Jason R. Coombs
No passo 4: abort: can't rebase immutable changeset 11b1e2b7dc4f. Observe que eu tenho enxertado conjuntos de alterações de outro ramo neste. Além disso, é dividido e mesclado gratuitamente.
Mark Jeronimus
@ Mark, dê uma olhada na Nota 3 acima.
alexis
6
Em vez de confirmar um conjunto de alterações na nova ramificação e, em seguida, refazê-la novamente, você pode omitir isso e usar .como --destvalor e a rebase assumirá o novo nome da ramificação automaticamente.
weberc2
16

Se você possui conjuntos de alterações, precisará usar a extensão convert com um mapa da filial para renomeá-lo. Todos terão que clonar o novo repositório ou retirar o ramo antigo.

tghw
fonte
1
Esta é uma solução interessante, você pode elaborar um pouco mais?
DrM
15

Faça um novo ramo chamado "estadiamento" e esqueça o outro ...

lctr30
fonte
+1 é o que eu faria. Os antigos conjuntos de alterações ainda terão o nome antigo da ramificação, mas os novos terão o novo nome da ramificação.
Barjak
6

Isso modifica o histórico e é apenas para usuários avançados do Mercurial. Não faça isso se você não souber o que isso significa.

Se o stiging for apenas local, você poderá alterá-lo para estadiamento com uma combinação de enxerto e tira . Comece atualizando para o changeset ancestral onde a divergência foi divergente. Crie a ramificação temporária e enxerte cada confirmação, desde a classificação até a preparação. O teste agora deve ser uma cópia do stiging. Por fim, destrua o stiging retirando seu primeiro 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
AWrightIV
fonte
1
Para a etapa 3, você pode usarhg graft {first changeset in stiging}..{stiging head}
KCD