2010-06-10 16 views
12

Tienda de Subversión considerando cambiar a Mercurial, tratando de descubrir de antemano cuáles serán las quejas de los desarrolladores. Aquí hay un caso de uso bastante común que no veo cómo manejarlo.Haciendo sin compromisos parciales la "vía Mercurial"

  1. estoy trabajando en alguna prestación bastante grande, y tengo una parte significativa del código - o posiblemente varias partes importantes del código - en pedazos por todo el suelo del garaje, totalmente inadecuado para el registro, tal vez Ni siquiera compilando.
  2. Aparece una solicitud urgente de corrección de errores. La solución es agradable y local y no toca ninguno de los códigos en los que he estado trabajando.
  3. Hago la corrección en mi copia de trabajo.

¿Y ahora qué?

He visto "Mercurial cherry picking changes for commit" y "best practices in mercurial: branch vs. clone, and partial merges?" y todas las sugerencias parecen ser extensiones de diversa complejidad, desde Grabar y Guardar hasta Colas.

El hecho de que aparentemente no haya ninguna funcionalidad básica para esto me hace sospechar que en cierto sentido este estilo de trabajo es Doing It Wrong. ¿Cómo sería una solución similar a Mercurial para este caso de uso?


Editado para añadir: GIT, por el contrario, parece diseñado para este flujo de trabajo: git add los archivos de corrección de errores, NO git add cualquier otra cosa (o git reset HEAD cualquier cosa que ya ha agregado), git commit.

+0

Las ramas y colas locales de vida corta son sin duda "funcionalidad central". La falta de una opción de "endosado" en este caso solo debe interpretarse como una validación de múltiples estilos de trabajo, y no como un descarte de ninguno. –

+0

También debe consultar [¿Cuál es la forma más fácil de enviar y enviar un solo archivo?] (Http://stackoverflow.com/questions/125272/using-mercurial-whats-the-easiest-way-to-commit-and- push-a-single-file-while-le) – Casebash

Respuesta

6

Se ofrece mucha funcionalidad útil para Mercurial en forma de extensiones, no tenga miedo de usarlas.

En cuanto a su pregunta, record proporciona lo que usted llama confirmaciones parciales (le permite seleccionar qué cantidad de cambios desea confirmar). Por otro lado, shelve le permite limpiar temporalmente su copia de trabajo, mientras mantiene los cambios localmente. Una vez que haya corregido la corrección de errores, puede desmantelar los cambios y continuar trabajando.

La forma canónica de evitar esto (es decir, usar solo el núcleo) probablemente sería hacer un clon (tenga en cuenta que los clones locales son baratos ya que se crean enlaces duros en lugar de copias).

+1

No tengo miedo de usar extensiones, pero tengo miedo de usar extensiones para evitar cambiar mi forma de pensar. Creo que necesito encontrar una manera de hacer que los clones locales sean tan baratos para el IDE como lo son para el sistema de archivos ... –

+1

'hg record' ~ =' git commit -i' y 'hg shelve' ~ =' git stash' –

3

Debería clonar el repositorio (es decir, crear una rama de corrección de errores en términos de SVN) y realizar la reparación desde allí.

Alternativamente, si realmente es una solución rápida, puede utilizar la opción -I en el compromiso para el check-in de archivos individuales explícitamente.

+0

Buen punto sobre -I. De hecho, ahora que estoy viendo la página del manual de hg, en lugar de limitar las quejas de las personas que han estado haciendo tutoriales, no estoy seguro de que el comportamiento de confirmación sea tan diferente de svn como pensé. –

+1

La opción '-I' ni siquiera es necesaria, puedes hacer' hg commit foo.c bar.h'. Veo las opciones '-I' y' -X' como algo que se usa si se quieren hacer lujosos filtros de inclusión/exclusión. Personalmente, nunca los utilizo, ya que mi caparazón puede hacer el engomado necesario para mí. –

3

Como cualquier DVCS, la ramificación es tu amigo. La ramificación de un repositorio de múltiples maneras es el pan y la mantequilla de este sistema. Aquí hay un git model que podría considerar adoptar que funciona bastante bien con Mercurial, también.

+0

Sí, tenía la sensación de que esa sería la respuesta. Puede que tenga que esperar que los IDE alcancen la idea de un cambio rápido entre sucursales. –

8

Aquí es cómo iba a manejar el caso:

  1. tener una rama dev
  2. tienen ramas de características
  3. tener una rama personal
  4. tener una rama estable.

En su situación hipotética, me comprometería con frecuencia en mi rama de la rama de características.

Cuando llegó la solicitud, yo llamaría a hg up -r XYZ donde XYZ es el número de rev que están ejecutando, luego ramifique una nueva rama de funciones fuera de eso (o up branchname, lo que sea).

Realice el trabajo y luego únase a la rama estable una vez que se haya probado el trabajo.

Vuelva a mi trabajo y realice la fusión desde el nodo de confirmación de la rama principal de funciones, integrando así las dos corrientes de esfuerzo.

+0

Eso tiene sentido. –

1

Además de what Santa said acerca de ramificación ser su amigo ...

de confirmaciones de granularidad pequeña son de su amigo. En lugar de realizar muchos cambios de código en una única confirmación, haga que cada código lógicamente autónomo cambie en su propia confirmación. Entonces será mucho más fácil elegir cuidadosamente los cambios para fusionar entre las ramas.

1

No utilice Mercurial sin usar el Mq Extension (viene preempaquetado en la instalación predeterminada). Además de resolver su problema específico, resuelve muchos otros problemas generales y realmente debería ser la forma predeterminada en que trabaja (especialmente si está utilizando un IDE que no se integra directamente con Hg, haciendo que las ramas se cambien sobre la marcha). una forma difícil de trabajar).