¿Cómo puedo evitar que algunas modificaciones se propaguen en mercurial?
mercurial-queue (4)
1 Mercurial tiene (seguimiento de los comentarios) confirmación selectiva (basada en cadenas) - ver la extensión de registro
2 Los cambios locales dentro de los archivos públicos versionados se pueden recibir fácilmente con MQ Extension (lo hago para las configuraciones de sitio todo el tiempo) . Tu dolor de cabeza con MQ
Cada vez que deseo enviar un conjunto de cambios regular al repositorio local, necesito abrir todos los parches, confirmar las modificaciones y volver a aplicar los parches. Cuando esté listo para avanzar al repositorio maestro, debo volver a abrir los parches, presionarlos y volver a aplicarlos.
es el resultado de un flujo de trabajo no depurado y (algunas) malas interpretaciones. Si quiere comprometerse sin MQ-patches, no lo haga a mano. Agregue alias para commit, que qop -all + commit y use este nuevo comando solamente. Y cuando presione, puede que no se preocupe por el estado MQ: empuja los conjuntos de cambios desde el repositorio, no desde el estado WC . El repositorio local también se puede proteger sin alias mediante el contenido de comprobación de gancho precompromiso.
3 Puede probar la extensión LocalBranches, donde los cambios locales se almacenan dentro de las sucursales locales (y fusionar las ramas en los cambios). Esto me pareció más problemático en comparación con MQ.
Estoy desarrollando una base de datos web que ya está en uso para una docena de instalaciones separadas, la mayoría de las cuales también administro. Cada instalación tiene bastante configuración y personalización local. Después de haber cambiado a mercurial desde svn, me gustaría aprovechar su naturaleza distribuida para realizar un seguimiento de las modificaciones locales. He configurado cada servidor instalado como su propio repositorio (y configuré apache para que no sirva a los directorios .hg).
Mi dificultad es que el árbol de desarrollo también contiene configuración local, y quiero evitar colocar cada bit en un archivo de configuración no versionada. Entonces, ¿cómo configuro las cosas para evitar la propagación de la configuración local al repositorio maestro y a las copias instaladas?
Ejemplo: Tengo un archivo largo config.ini que debe ser versionado y distribuido. La versión "limpia" contiene marcadores de posición para los parámetros de conexión de la base de datos, y no quiero que las contraseñas del servidor de desarrollo terminen en los repositorios para las copias instaladas. Pero de vez en cuando haré cambios (por ejemplo, nuevos valores predeterminados) que necesito propagar. Hay varios archivos en una situación similar.
Lo mejor que pude hacer hasta ahora es instalar mq y convertir las modificaciones locales en un parche (dos parches, en realidad, con conjuntos de cambios lógicamente separados). Cada vez que deseo enviar un conjunto de cambios regular al repositorio local , necesito abrir todos los parches, confirmar las modificaciones y volver a aplicar los parches. Cuando esté listo para avanzar al repositorio maestro, debo volver a abrir los parches, presionarlos y volver a aplicarlos. Todo esto es intrincado y propenso a errores.
La única alternativa que puedo ver es olvidarme del empuje y solo propagar los conjuntos de cambios como parches, lo que parece una solución aún peor. ¿Alguien puede sugerir una mejor configuración? No me puedo imaginar que esta sea una configuración tan inusual, pero no he encontrado nada al respecto.
Editar: después de seguir las sugerencias aquí, estoy llegando a la conclusión de que las ramas nombradas más rebase proporcionan una solución simple y viable. He agregado una descripción en forma de mi propia respuesta. Por favor echa un vistazo.
Según sus comentarios, parece que ya está familiarizado con las mejores prácticas para tratar con esto: versione una plantilla de configuración y mantenga la configuración real sin versión.
Pero como no está contento con esa solución, aquí hay otra que puede probar:
Mercurial 2.1 introdujo el concepto de Fases . La fase es metadatos del conjunto de cambios que lo marcan como "secreto", "borrador" o "público". Normalmente, mercurial y sus extensiones utilizan y manipulan estos metadatos de forma automática, sin que el usuario deba tenerlos en cuenta.
Sin embargo, si creó un conjunto de cambios 1234
que no desea enviar a otros repositorios, puede aplicar esto marcándolo manualmente como secreto de esta manera:
hg phase --force --secret -r 1234
Si luego intenta ingresar a otro repositorio, se ignorará con esta advertencia:
pushing to http://example.com/some/other/repository
searching for changes
no changes found (ignored 1 secret changesets)
Esta solución te permite
- versión los cambios de configuración local
- evitar que esos cambios sean empujados accidentalmente
- fusiona tus cambios locales con otros cambios que hagas
La gran desventaja es, por supuesto, que no puede impulsar los cambios que realizó sobre este conjunto de cambios secretos (porque eso empujaría el conjunto de cambios secretos). Deberá volver a establecer los cambios antes de poder aplicarlos.
Si el problema con una plantilla versionada y una copia local no versionada es que los cambios en la plantilla no se convierten en copias locales, ¿qué le parece modificar su aplicación para usar un localconfig.ini
no versionado y una alternativa a la localconfig.ini
por falta? parámetros. De esta forma, se pueden agregar nuevos parámetros predeterminados a config.ini
y propagarse a su aplicación.
Habiendo seguido las sugerencias aquí, llegué a la conclusión de que las sucursales nombradas más rebase
proporcionan una solución simple y confiable. He estado usando el siguiente método desde hace un tiempo y funciona muy bien. Básicamente, el historial en torno a los cambios locales se divide en ramas con nombre que se pueden reorganizar fácilmente con rebase.
Utilizo una rama local
para obtener información de configuración. Cuando todos mis repos admitan Fases, marcaré el secret
sucursal local; pero el método funciona sin eso. local
depende del default
, pero el valor predeterminado no depende de lo local
por lo que puede enviarse de forma independiente (con hg push -r default
). Así es como funciona:
Supongamos que la línea principal de desarrollo está en la rama
default
. (Podrías tener más ramas, esto es por concreción). Hay un repositorio maestro (estable) que no contiene contraseñas, etc.---o--o--o (default)
En cada clon desplegado (sin desarrollo), creo una sucursal
local
y le asigno todo el estado local....o--o--o (default) / L--L (local)
Las actualizaciones de upstream siempre estarán en default. Cada vez que retiro actualizaciones, las combino en
local
(n
es una secuencia de nuevas actualizaciones):...o--o--o--n--n (default) / / L--L--N (local)
La sucursal local realiza un seguimiento de la evolución del
default
, y aún puedo regresar a las configuraciones anteriores si algo sale mal.En el servidor de desarrollo, comienzo con la misma configuración: una rama
local
con configuración de configuración como la anterior. Esto nunca será empujado. Pero en la punta de lolocal
creo una tercera rama,dev
. Aquí es donde ocurre un nuevo desarrollo....o--o (default) / L--L (local) / d--d--d (dev)
Cuando estoy listo para publicar algunas características en el repositorio principal, primero rebase toda la rama de desarrollo al
default
:hg rebase --source "min(branch(''dev''))" --dest default --detach
El árbol anterior se convierte en:
...o--o--d--d--d (default) / L--L (local)
Los conjuntos de cambios reubicados ahora pertenecen a la rama
default
. (Con ramas de características, agregue--keepbranches
al comando rebase para retener el nombre de la rama). Las nuevas características ya no tienen antepasados enlocal
, y puedo publicarlos conpush -r default
sin arrastrar a lo largo de las revisiones locales. (Nunca fusione delocal
adefault
, solo al revés). Si se olvida de decir "-r default
al presionar, no hay problema: su empuje es rechazado ya que agregaría un nuevo cabezal.En el servidor de desarrollo, fusiono las revoluciones reajustadas en
local
como si acabara de sacarlas:...o--o--d--d--d (default) / / L--L-----N (local)
Ahora puedo crear una nueva rama de desarrollo además de
local
, y continuar el desarrollo.
Esto tiene los beneficios que puedo desarrollar en una configuración configurada y controlada por la versión; que no necesito meterme con parches; que las etapas de configuración anteriores permanecen en el historial (si mi servidor web deja de funcionar después de una actualización, puedo actualizar a una versión configurada ); y que solo rebase una vez, cuando estoy listo para publicar cambios. La rebase y la fusión posterior pueden generar conflictos si una revisión entra en conflicto con los cambios de configuración locales; pero si eso va a suceder, es mejor si ocurren cuando las instalaciones de fusión pueden ayudar a resolverlos.