2011-05-08 8 views
6

Esta pregunta puede reformularse como:Cómo mover una etiqueta en el SVN

¿Cómo puedo incluir un solo cambio en el maletero de un archivo específico en una etiqueta existente.

Una pregunta simple, pero que no pude resolver personalmente.

El concepto proviene de otras herramientas de SCM, donde simplemente mueve una etiqueta sobre las diferentes revisiones y la "pega" a la revisión exacta que necesita. Esas otras herramientas tienen la comprensión nativa de lo que es una etiqueta, donde SVN generalizó todo como una rama de copia.

A continuación respuestas que he visto en otras tablones de anuncios y mensajes sobre el mismo, y como tal ya fueron consideradas y rechazadas:

  1. Este no es el correcto uso de SVN
    • En realidad, SVN era diseñado para ser genérico y lograr muchos patrones de uso
    • Esta es una misión para encontrar una respuesta. Entiendo los desafíos y la posibilidad de de nunca encontrar una respuesta. Tal vez cambie a una herramienta diferente.
  2. ¿Por qué está utilizando SVN como tal? Entonces, es mejor hacer esto y aquello.
    • Hay muchos patrones de uso o modelos SCM que se pueden adoptar. En mi caso específicamente:
      • El tronco representa un desarrollo continuo, y se le aplican pequeños parches.
      • La producción es una etiqueta TAG
      • la evolución del desarrollo es muy corta y agresiva, y como tal no podemos trabajar con varias versiones de producción completas. Eso significa que no puedo crear cada vez una nueva etiqueta para cada pequeño subcambio implementado en la producción.
      • En resumen, las versiones completas de producción empaquetada no existen en mi escenario.
    • Este es mi caso de uso que necesito.

Bueno, no voy a estar presuntuoso, y voy a leer cada solución único previsto y reconsiderar si es necesario.

+1

Si lo hice bien, ¿desea fusionar los cambios realizados en un solo archivo troncal, en una ruta de acceso de rama? ¿De qué manera quiere que esto difiera de la fusión estándar en SVN? – Groo

+1

¿Entonces solo tiene una etiqueta en un momento dado? No hay una razón técnica por la que esto no funcione, pero no es exactamente como funcionan las etiquetas. Cada vez que publica una versión, puede etiquetarla con el número de versión (como 1.0) y luego, si necesita liberar una versión ligeramente modificada, cree una etiqueta * new * llamada 1.0.1. Entonces podría tener otra etiqueta llamada "última" o algo que siempre tenga su última versión. – MatrixFrog

+0

Tengo el mismo problema. ¿Cómo "mueve" una etiqueta, es decir, si ya etiquetó su cabeza copiándola para decir etiquetas/1.5.0, entonces se dio cuenta de que necesita actualizar un archivo, e incluirlo con esta versión etiquetada que se convertirá en el lanzamiento . No puedes crear una nueva etiqueta, ya que tiene que ser "1.5.0", por ejemplo. Necesitamos etiquetar la nueva versión del único archivo, tipo de overwerite de la versión anterior. Esto no parece ser posible en SVN. si intenta copiar la nueva versión a la misma etiqueta, se queja de que ya existe. No podemos "verificar" la etiqueta en un nuevo directorio, ya que el repositorio es demasiado grande. –

Respuesta

3

Las etiquetas y las ramas no son diferentes en SVN. Toda la diferencia está en las políticas que los equipos siguen para saber cómo trabajar con etiquetas y sucursales.

Para que pueda combinar los cambios en una etiqueta y confirmar una nueva revisión de la misma manera que lo haría con una rama. Es comprensible que generalmente no quiera hacer eso, para "etiquetar" las versiones exactas de los archivos que utilizó para un lanzamiento. Pero si realmente se requiere, puede hacer una excepción de esta regla una vez.

Como alternativa, puede quitar la etiqueta y luego volver a crearla utilizando las revisiones correctas.

Un par de enlaces a la guía SVN: "Tags", "Branch Maintenance"


añadido: Por lo tanto, los sonidos que tal re-etiquetado no es un caso de uso atípico rara, sino más bien un habitual practica en tu equipo. Parece que con las etiquetas no solo le das un nombre a una instantánea particular de tus archivos, sino que deseas que ese nombre siga las actualizaciones posteriores de los archivos, olvidando su lugar anterior. También parece que encuentras ramas incómodas para tu flujo de trabajo.

Bueno, no creo que haya una manera simple y limpia de lograr lo que quiere con SVN. En mi opinión, es mejor "abrazar" las sucursales y aprender a usarlas de manera eficiente.

+0

Sí, todo lo que consideré: fusionarme en la etiqueta o volver a crear la etiqueta. El problema es que es complejo para la cantidad de personas que ponen un solo archivo en producción. Realmente necesito tener una acción simple que me permita seleccionar un archivo y simplemente fusionarlo en la etiqueta de producción. – YoYo

+1

Creo que puede simplemente 'svn cambiar' a la etiqueta, obtener el archivo (desde el tronco o donde sea) y ponerlo en su copia de trabajo, y luego' svn confirmar' el cambio. Luego 'svn switch' vuelve al trunk, para asegurarse de no cometer accidentalmente un nuevo desarrollo que pertenece en el trunk a la etiqueta. – MatrixFrog

1

Tu comentario en la respuesta de @Alexey Kukanov me indica que lo que realmente quieres es una rama, no una etiqueta. Una etiqueta es un registro histórico de un punto único e inmutable en el tiempo. Una rama es una copia del código que sufrirá más cambios a medida que pasa el tiempo. Estás hablando de esto último. Es una práctica estándar crear ramas "de corrección de errores" o de "producción" para cada versión que esté soportando, y bien confirmar los cambios directamente en la rama [1] o combinarlos desde la troncal.

Las etiquetas, en este caso, se usarían para crear "copias" de la rama para indicar "exactamente este código estaba en producción en este momento en particular". Por lo tanto, puede volver fácilmente y comparar en caso de necesidad.

[1] ... y luego combinarlos con el tronco en su caso

2

He encontrado 1 manera fácil de hacer esto (es decir, mover una etiqueta para un archivo) usando tortoisesvn.

  1. navega en el repo haciendo clic derecho sobre el proyecto dir desprotegido y seleccionando "tortuga SVN-> Repo-browser"
  2. Vaya al archivo que desea cambiar dentro de sus etiquetas/directorio
  3. botón derecho del ratón en el archivo y selecciona "pagar".
  4. Selecciona un directorio temporal en tu HD y presiona ok.
  5. Sobrescriba este archivo con su versión actualizada (utilizando su explorador de archivos local, no el navegador de repositorio SVN)
  6. haga clic derecho en el archivo y seleccione "SVN checkin".

Trabajo realizado.

Para hacer lo mismo usando CVS es trivial, sólo tiene que ir al directorio y tipo requerido: "cvs tag -F tagname nombre de archivo" SVN duerma realmente tienen etiquetas, lo que hace que sea doloroso para su uso (en mi opinión) .

No estoy seguro de por qué se ha votado negativamente: así es como resolvemos el problema exacto establecido en la pregunta.

+0

Este es exactamente el paso que faltaba que estaba buscando. Simplemente quiere hacer una fusión, pero para hacerlo debe primero verificar en otra ubicación. Y por cierto, si el cambio es uno que ya ha registrado después de la etiqueta, puede hacer una combinación adecuada en el paso 5. – usethe4ce

2

Las etiquetas y las sucursales en Subversion son en realidad solo directorios. El concepto de lo que son no está incrustado en Subversion, sino en tu cerebro.

Como han dicho otros, las etiquetas son instantáneas de su repositorio en un momento determinado y no deberían estar cambiando. Si planea cambiar una etiqueta, realmente debería ser una sucursal.

Por ejemplo,

  • Quiero una etiqueta que muestra los cambios aprobados: Que sea una rama en lugar de una etiqueta.
  • Quiero mostrar qué archivos se han utilizado para la última compilación: Ídem.
  • Quiero mostrar qué código se ha revisado: Ídem.

¡Pero estas no son sucursales! usted queja demanda.

Muy bien, la estructura sugerida de un repositorio es solo eso: Una sugerencia. Se podría añadir otro directorio además trunk, tags, y branches para estos etiquetas móviles:

$repo/trunk 
$repo/branches 
$repo/tags 
$repo/moveable_tags 

Ahora, usted puede poner las etiquetas que cambiar bajo moveable_tags, y las etiquetas que la gente utiliza para las liberaciones, instantáneas , etc. bajo etiquetas.

He modificado el diseño de repositorio sugerido antes en una ubicación donde trabajé. Quería eliminar las ramas obsoletas y las etiquetas del repositorio, pero la dirección y los desarrolladores se opusieron.

Dije que borrando estos no lo estaban borrando del repositorio. Podría recuperarlos fácilmente si es necesario, pero eliminándolos eliminaré mucho desorden innecesario de estos dos directorios. Sin embargo, los desarrolladores no se sintieron seguros en esto. Claro, puedo encontrarlos, ¿pero pueden?

En cambio, he añadido un obsolete/tags y un obsolete/branches directorios a la trunk, tags, y branches nivel de directorio. En lugar de eliminar etiquetas y ramas obsoletas, solo las moví. tags y branches no fueron desordenados, y los gerentes y desarrolladores se sintieron mejor de lo que sabían si encontraran estas ramas y etiquetas obsoletas si alguna vez las necesitaran.


Digamos que no está haciendo nada elegante con las etiquetas. Utiliza etiquetas como instantáneas y cualquier cosa que espere cambiar y actualizar es una rama. Todavía hay momentos en que una etiqueta podría necesitar ser cambiada.

Y, Subversion es mejor para manejar esto que la mayoría de los demás sistemas de control de versiones. Eso es porque las etiquetas contienen todo el historial de su creación y cambios. En la mayoría de los otros sistemas de control de versiones, el historial de esa etiqueta es un ciudadano de segunda clase si es que se mantiene. Puedes ver la etiqueta. Puede ver qué archivos y versiones están bajo esa etiqueta, pero no puede ver quién creó esa etiqueta y cómo se modificó. En Subversion, las etiquetas contienen todo su historial.

para hacer un cambio en una etiqueta:

  • Mira la etiqueta.
  • Haga el cambio.
  • Confirme su cambio.

O, mejor aún, utilizar svn cp, svn mv, o svn delete contra la URL del repositorio y no contra un directorio de trabajo. Por ejemplo, creé una etiqueta para la versión 2.0. De repente, nos dimos cuenta de que olvidamos un cambio muy importante que está saliendo en este lanzamiento. En lugar de un pago y envío, usted hace esto:

$ svn cp -r 23933 -m"This change in this file should have been included in the tag" \ 
    $repo/trunk/foo/src/foo.java $repo/tags/2.0/foo/src/foo.java 

Cuando nos fijamos en la historia de esta etiqueta, ahora verá.

$svn log -v $repo/tags/2.0 
------------------------------------------------------------------------ 
r23945 | david | 2013-04-03 11:21:55 -0400 (Wed, 3 Apr 2013) | xxx lines 
Changed paths: 
M /tags/2.0/foo/src/foo.java (from /trunk/foo/src/foo.java:23933) 

This change in this file should have been included in the tag 

------------------------------------------------------------------------ 
r23932 | david | 2013-04-10 11:18:40 -0400 (Wed, 10 Apr 2013) | 1 line 
Changed paths: 
A /tags/2.0 (from /trunk:23921) 

Created release 2.0 

Veo que la etiqueta se creó hace una semana a partir de la revisión 23921 en el maletero. Luego veo que el archivo foo.java se actualizó una semana después de la revisión 23933 en el enlace troncal.

0

También necesito hacer eso alguna vez. Lo que haces compruebas tu archivo svn desde la etiqueta, no desde la rama (algo así como svn: // blahblah/tags/mytag, no svn: // blahblah/branches/mybranch), entonces comprometes el archivo modificado allí , y tendrá la etiqueta actualizada.

Cuestiones relacionadas