Estoy usando la rama default
para el desarrollo continuo, y ahora voy a crear una nueva rama con nombre para marcar una versión. Todo el desarrollo ulterior estará en la rama por defecto, todas las correcciones de errores de producción se hará sobre la nueva (con la posterior fusión a default
), así:Mercurial: permite combinar una rama de versión con la predeterminada, pero no al revés
#>hg branches
aristotle 42:dbd...
default 41:da5...
#>hg branch
default
#>echo "Feature #1 for the next release" >> feature1.txt
#>hg add
#>hg commit -m "Implement feature #1 for the next release"
...... eek, need to make an urgent fix on Production .....
#>hg update aristotle
#>echo "Fixed urgent bug #123 on Production" >> fix123.txt
#>hg add
#>hg commit -m "Fixed bug #123 on Production"
created new head
#>hg update default
#>hg merge aristotle
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, dont forget to commit)
#>hg commit -m "Merge in the fix for bug #123"
#>hg push
Lo anterior parece el camino a seguir, Sin embargo, parece fácil desordenar las cosas y combinar al revés (desde default
hasta aristotle
lo que significa que todas las nuevas características aparecerán en la rama de producción).
Quizás mis temores carezcan de fundamento porque uno notará el desorden antes de enviar la confirmación al repositorio central, pero me gustaría ver si es posible hacer que el enfoque sea más infalible.
Así que me puse a buscar en los ganchos:
[hooks]
pretxnchangegroup.branch = hg heads --template "{branches} " | find "aristotle" && exit 1 || exit 0
..pero luego se dio cuenta que no es lo que necesito, porque esto no va a permitir que empuje cambios Aristóteles en absoluto.
Así que no estoy seguro de qué hacer. Idealmente, quiero que los desarrolladores vean el mensaje "fusionarse de manera incorrecta" cuando intentan realizar una fusión de default
a aristotle
localmente (obviamente, debe haber una doble verificación en el repositorio central), mientras se fusionan de la rama de producción a el predeterminado debe ser posible.
Gracias!
Quizás pueda hacer algo donde si la confirmación está en la rama de producción, y esa confirmación tiene más de un padre (una confirmación de fusión), y uno de esos padres está en la rama predeterminada, falla. Es posible que desee consultar la extensión contiene para ayudar con algo de esto: http://mercurial.selenic.com/wiki/ContainsExtension No tenemos ninguna protección real contra esto, pero tenemos un gancho post-commit que imprime lo que sucedió realmente durante la confirmación (está fusionando branch1 en branch2), que el desarrollador puede leer para verificar que hicieron lo correcto. –
Marca, muchas gracias por el comentario, pero "hg update default" seguido de "hg merge aristotle" parece exactamente como "fusionar branch1 en branch2" (y, por desgracia, un mensaje no impide el push/commit incorrecto). Además, no estoy seguro de cómo "contiene la extensión" puede ayudar en mi caso :(¿Tal vez pueda explicar cómo implementó exactamente su gancho post-commit? – andreister
Mi enlace post-commit no evita que ocurra nada, pero proporciona información a la persona que realiza el compromiso que explica la acción que está sucediendo. Es como cuando lees un número de teléfono a alguien y luego le pides que se lo lea de nuevo para asegurarte de que te entendieron. Realizas una combinación y luego Mercurial le explica la acción nuevamente para que pueda tomar un error. –