Mercurial: ¿Puedo cambiar el nombre de una sucursal?

205

Ahora tenemos una rama "estigmatizante", donde la "puesta en escena" parece ser un ajuste semántico mucho mejor. ¿Cuál es una buena estrategia para manejar esto?

KevDog
fuente

Respuestas:

224

Actualice la stigingrama y cree una nueva rama a partir de ella. Luego cierra la rama vieja.

En resumen:

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
fuente
1
Esta es la mejor manera de hacer esto que he encontrado. Cerrar la rama evita que otros la usen accidentalmente porque no aparece en la salida de "ramas hg". Todavía le permite acceder más tarde si conoce el nombre.
Utensilio
2
¿Mercurial permitirá reutilizar el nombre de una sucursal cerrada? Es decir, si tiene una rama v3, ¿puede usar la técnica anterior para cambiarle el nombre a v4 y luego bifurcar una nueva rama v3 a pesar de haber dejado una v3 cerrada?
Joshua Goldberg
44
@ JoshuaGoldberg, 3noch está mal. Mercurial le permitirá reutilizar el nombre de una sucursal cerrada si lo usa --force. Por ejemplo: hg branch --force v3. Esto dará como resultado la hg update v3actualización a la nueva v3sucursal, como lo deseaba.
Gili
2
confirmó el comentario de @Gili con hg help branch: "--force establecer el nombre de la sucursal incluso si sombrea una rama existente"
Joshua Goldberg
77
Si cierra stigingantes de bifurcarse, no obtendrá un "extremo suelto"
max.mustermann
60

Para futuros lectores: con la rebaseextensión, puede crear una nueva sucursal con el mismo padre stigingy mover todo el historial de la sucursal, de esta manera:

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

Esto supone que stigingsolo tiene un padre. Por supuesto, puede usar números de revisión explícitos en su lugar.

Nota 1: Si la rama stigingincluye fusiones con otras ramas, creo que esto las preservará, siempre stagingy cuando stigingtengan el mismo padre. Pero ciertamente lo verificaría dos veces.

Nota 2: dado que esto edita el historial, la rama anterior no desaparecerá simplemente de los repositorios clonados (consulte la rebasedocumentación). A menos que todos puedan clonar de nuevo, puede que no sea una solución muy práctica para un grupo grande.

Nota 3 / Editar (cortesía de @JasonRCoombs): ahora que las fases son estándar en mercurial, rebasese negará a modificar los conjuntos de cambios que ya se han enviado. Puede engañarlo cambiando la fase de nuevo a borrador (con hg phases), o dejar que la rama anterior permanezca donde está, y simplemente hacer una copia con el nombre correcto (por ejemplo, con `hg rebase --keep ').

alexis
fuente
+1 para equipos pequeños donde puede obligar a los usuarios a clonar esta es una buena idea, o usar hg converten su lugar.
hochl
55
Con las últimas versiones de Mercurial, el comando rebase fallará con "no se puede volver a crear un conjunto de cambios inmutable" si los cambios que se van a mover son "públicos". Puede forzarlos a ser borradores (con fases hg) o pasar --keepal comando rebase, que copiará en lugar de mover los cambios.
Jason R. Coombs
En el paso 4: abort: can't rebase immutable changeset 11b1e2b7dc4f. Tenga en cuenta que he injertado los conjuntos de cambios de otra rama en esta. Además de eso, se divide y se fusiona gratis.
Mark Jeronimus
@ Mark, eche un vistazo a la Nota 3 anterior.
alexis
66
En lugar de comprometer un conjunto de cambios en la nueva rama y luego volver a crear una nueva base , puede omitir eso y usarlo .para su --destvalor, y la nueva toma tomará el nuevo nombre de la rama automáticamente.
weberc2
16

Si tiene conjuntos de cambios, deberá usar la extensión de conversión con un mapa de rama para cambiarle el nombre. Todos tendrán que clonar el nuevo repositorio o quitar la rama vieja.

tghw
fuente
1
Esta es una solución interesante, ¿puedes elaborar un poco más?
DrM
15

Haga una nueva rama llamada "puesta en escena" y olvide la otra ...

lctr30
fuente
+1 eso es lo que haría. Los viejos conjuntos de cambios seguirán teniendo el nombre de la rama anterior, pero los nuevos tendrán el nuevo nombre de la rama.
barjak
6

Esto modifica el historial y es solo para usuarios avanzados de Mercurial. No hagas esto si no sabes lo que eso significa.

Si el estigma es solo local, puede cambiarlo a una puesta en escena con una combinación de injerto y tira . Comience actualizando el conjunto de cambios ancestro donde el estigma había divergido. Cree la rama de preparación e injerte cada confirmación desde el estigma hasta la puesta en escena. La puesta en escena ahora debería ser una copia del estigma. Por último, destruya el estigma eliminando su primer compromiso.

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
fuente
1
Para el paso 3 puede usarhg graft {first changeset in stiging}..{stiging head}
KCD