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.
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
¿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
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. –