2010-11-09 18 views
5

El comando qrefresh en la extensión MQ no tiene sentido para mí. Explicaré mi suposición:¿Se considera `qrefresh` dañino?

  1. Si no sabe en qué revisión se debe aplicar un parche determinado, tiene muy poco valor. Simplemente no se puede saber teóricamente qué significan los rechazados. E incluso si no hay rechazos en una revisión determinada, no está seguro de que la revisión completa compilaría.
  2. Una vez que qrefresh un cierto parche en la cola de parches, en realidad está perdiendo el padre del siguiente parche en la cola. Para que sin su intervención este próximo parche sea/pueda ser inútil.
  3. Para arreglar el próximo parche, es mejor fusionarlo en lugar de editar manualmente los archivos .rej. No solo por las mejores herramientas, si tiene el parche original qrefresh 'ed, tiene más información, el qrefresh le hizo perder la información que realmente necesita para que el cambio realizado en el parche sea significativo.

Por lo tanto, no entiendo por qué uno querría usar este comando.

Una mejor alternativa es aplicar todos los parches, luego hg update al padre del parche que desea cambiar, entonces, hg revert el directorio de trabajo del parche que desea cambiar. Cambie este parche, comprométalo con una nueva revisión y luego vuelva a establecer la base de todos los demás parches en esta nueva revisión.

Simplemente no entiendo cuando qrefresh es relevante cuando no está editando un solo parche solamente. Parece que el enfoque de git (aplicar el parche a una sucursal local) tiene mucho más sentido que una cola de parches.

¿Estoy en lo correcto, y será mejor que use rebase? ¿Hay algo que eché de menos?

emigraron de kiln.se.com debido a la falta de respuesta y de visión baja tasa

+4

pienso necesitas describir lo que piensas qrefresh y cómo lo usas. Nada de lo que dices se asemeja a cómo uso qrefresh. –

+0

El único uso que conozco es cambiar un parche en algún lugar de la pila de parches, y luego volver a aplicar todos los parches. Explícame si me faltan otros usos. –

+0

¿Tal vez cambiar la línea de mensaje del parche superior cuando no es lo suficientemente descriptivo o no sigue la convención que desea? – kriss

Respuesta

3

EDITAR: después de escribir la respuesta a continuación, me topé con la chapter about patches de Mercurial La guía definitiva . Dice más o menos lo mismo, pero es mucho más que mi respuesta detallada. También sugieren una forma (un poco intrincada para mi gusto , pero de todos modos) para utilizar la combinación 3-way con parches, ya que el OP estaba buscando para.

¿Quizás vea mq solo como una herramienta de importación de parches? Ese no es mi uso principal, y para mí qrefresh es muy útil. El caso típico de uso para mí es cuando estoy trabajando en la parte superior del repositorio publicado.

Normalmente trabajo con una serie de parches que estoy escribiendo al mismo tiempo. Comienzo creando un nuevo parche vacío. Cuando creo que se ha terminado alguna característica (parte de una), I qrefresh el parche superior para incluir todos los cambios realizados desde el momento de creación del parche (o el último qrefresh). Luego creo un nuevo parche vacío y sigo escribiendo el código que pertenece al siguiente parche.

Si más tarde, cuando trabajo en otro parche, veo algún cambio que debe hacerse dentro de un parche anterior (porque lógicamente pertenece), no realizo el cambio en el parche superior ni creo un parche nuevo . Primero I qrefresh el parche actual, luego qpop al parche anterior al que pertenecen los cambios, luego realizo mis cambios. Cuando se hace I qrefresh de nuevo el parche anterior, luego qpush volver a donde estaba trabajando, y así sucesivamente.

Cuando trabajas de esta manera, las fusiones suelen ser muy sencillas y casi no tengo rechazos qpop ing y qpush alrededor.

Cuando creo que mi serie completa de parches está lista para publicarse, I qfinish toda la serie, y empiezo de nuevo con una nueva pila de parches vacía.

Es posible hacer el mismo tipo de cosas con rebase, pero entonces necesitaría una función como git interactive rebase.

El objetivo de trabajar con parches es que los parches aún no se han comprometido, por lo que pueden cambiarse fácilmente, y para eso necesita qrefresh. Bueno, podría lograr el mismo resultado creando nuevos parches y qfold ing ellos, pero realmente no tendría sentido hacerlo, solo dos comandos en lugar de uno.

Ahora, cuando los parches son contribuciones externas, como un mantenimiento principal para las contribuciones de mi proyecto se incluyen desde parches proporcionados por los contribuyentes y nunca llegan directamente al repositorio. Primero entran en mi pila de parches principal. Si realizan cambios en las mismas partes del programa en el que estoy trabajando, es probable que causen rechazos (y si es así, basicamente no lo inserto, es probable que cause estragos). Si se aplican a alguna otra parte del programa que no se cambia actualmente, básicamente se fusionan sin ningún problema y se puede importar en cualquier punto de la pila de parches, sin obligación de insertarlos en una revisión específica. Pero siempre leo los cambios, y muy a menudo cambio ligeramente el código contribuido. Entonces otra vez uso qrefresh para actualizar el parche externo a lo que creo que debería ser.

+0

Esto es exactamente lo que estoy haciendo, pero ocasionalmente recibo rechazos, y cuando lo hago es muy doloroso resolverlos ya que no puedo hacer una fusión tripartita, ya que qrefresh volcó los datos que necesito para poder hacer ese. Y no veo ninguna razón para que haga mi vida más difícil.El problema clave que veo con su publicación es "El objetivo de trabajar con parches es que los parches aún no se han comprometido, por lo que pueden cambiarse fácilmente", ¿por qué debería importar si un parche está comprometido o no? Simplemente compromételos con una sucursal local y luego rebase a su voluntad, será lo mismo pero más fácil. Todavía no veo ninguna razón para no hacer eso. –

+0

Ah, y los parches externos no son diferentes, si tiene el parche A contra la revisión R, simplemente aplique el parche a la revisión R y consérvelo como una nueva sucursal local. Lo mismo que MQ, solo con más información y fusión de 3 vías más fácil. qrefresh es lo mismo, pero pierde información, así que no veo razón para usarlo. –

+0

Obviamente, puede hacerlo sin parches. Tu problema parece no ser con qrefresh, sino con el uso de parches para la administración de versiones. Señaló exactamente el punto más importante en mi respuesta: hay casos en los que ** quiero ** que pierda información para mantener mi historial de repositorio simple. En el caso de las fusiones, si la fusión no es fácil, generalmente estoy mejor sin fusionarme en absoluto. Incluso con combinaciones de 3 vías, el riesgo es muy alto. Haré algo mal (como obtener la versión incorrecta para parte de las líneas, ya que de todos modos es un proceso manual), y el problema es exactamente el mismo con la rebase. – kriss

0

Usted debe escoger la respuesta de Kriss, s/él lo explica todo muy bien, pero aquí hay un artículo sobre el software que inspiró la función de gestión de parches en tanto voluble y GIT, edredón:

http://www.suse.de/~agruen/quilt.pdf

+0

buen enlace, gracias. – kriss

+0

Este software fue escrito sin control de versión ágil como 'hg' o' git'.Por lo tanto, mi estrategia no estaba disponible entonces. No estoy seguro de que el autor de la colcha esté en desacuerdo conmigo en mi opinión. –

Cuestiones relacionadas