2009-05-12 13 views
256

Estoy creando mi primer proyecto en Subversion. Hasta ahora tengo¿Cómo crear correctamente una etiqueta SVN desde el enlace troncal?

branches 
tags 
trunk 

Creo que inmediatamente necesito hacer ramas singulares y comenzar de nuevo. Actualizar ramas es la norma.

He estado trabajando en el maletero y moviendo el contenido a las etiquetas de la siguiente manera.

mkdir tags/1.0 
cp -rf trunk/* tags/1.0 
svn add tags/1.0 
svn commit -m " create a first tagged version" 

Mi instinto me dice que esto es totalmente erróneo, y que debe mantener alguna relación entre los archivos usando svn copy. Los archivos que creo de esta manera no tendrán ninguna relación entre ellos, y estoy seguro de que me perderé las funciones de Subversion. ¿Estoy en lo correcto?

¿Debo usar svn copy para los archivos individuales?

mkdir tags/1.0 
svn add tags/1.0 
svn copy trunk/file1 tags/1.0 
svn copy trunk/file2 tags/1.0 
svn copy trunk/file3 tags/1.0 
svn commit -m " create a first tagged version" 

¿Debo usar svn copy en el directorio completo?

svn copy cp -rf trunk tags/1.0 
svn commit -m " create a first tagged version" 
+10

Desafortunadamente no tomo todas las decisiones en este caso ... git es bastante malditamente mágico. – ojblass

Respuesta

178

Tiene usted razón en que no es "correcto" para añadir los archivos a la carpeta de etiquetas.

Ha adivinado correctamente que copy es la operación a usar; permite a Subversion realizar un seguimiento del historial de estos archivos, y también (supongo) almacenarlos de manera mucho más eficiente.

En mi experiencia, es mejor hacer copias ("instantáneas") de proyectos completos, es decir, todos los archivos de la ubicación de extracción raíz. De esta forma, la instantánea puede ser independiente, como una representación real del estado del proyecto completo en un momento particular.

This part of "the book" muestra cómo se utiliza normalmente el comando.

+14

La versión 1.1 del libro está terriblemente desactualizada. Aquí hay un enlace mejor: http://svnbook.red-bean.com/nightly/en/svn.branchmerge.tags.html –

+1

archivos copiados no gasta ningún espacio extra – Carlos

387

Simplemente haga

svn copy http://svn.example.com/project/trunk \ 
     http://svn.example.com/project/tags/1.0 -m "Release 1.0" 
+33

Marqué esto como respuesta. Solo una nota extra. Puede obtener una revisión previa del tronco y "etiquetarlo" también. el comando: svn copy -r 123 "http://svn.example.com/project/trunk" "http://svn.example.com/project/tags/1.0" -m "Etiquetado, pero con revisión anterior (123). " – granadaCoder

+4

Obtengo ** svn: las operaciones locales sin compromiso no toman un mensaje de registro ni las propiedades de revisión **, así que simplemente elimino la opción -m. – Jonny

+4

Solo un FYI, asegúrese de que su URL coincida con su repositorio, incluyendo http o https. –

12

Como señaló @victor Hugo, la forma "correcta" es usar svn copy. Sin embargo, hay una advertencia. La "etiqueta" creada de esa manera no será una etiqueta verdadera, será una copia exacta de la revisión especificada, pero será una revisión diferente de . Entonces, si su sistema de compilación utiliza la revisión svn de alguna manera (por ejemplo, incorpora el número obtenido con 'svn info' en la versión de del producto que compila), entonces no podrá construir exactamente el mismo producto desde etiqueta (el resultado tendrá la revisión de la etiqueta en lugar de la del código original ).

Parece que, por diseño, no hay manera en svn de crear una metaetiqueta realmente adecuada.

+4

Es posible utilizar "Last Changed Rev": '' ' echo "{'svnRev': \" 'svn info | awk '/ Last Changed Rev:/{print $ 4}' '\"} "> svnver.txt''' ' – 18446744073709551615

+0

De esta manera, dos ramas con (por supuesto) diferentes números de revisión todavía producen la misma versión de software. – 18446744073709551615

+1

Sí, tiene razón acerca de Last Changed Rev, pero eso no cambia el hecho de que, por diseño, no hay etiquetas reales en Subversion. –

7

@victor hugo y @unwind son correctos, y la solución de victor es de lejos la más simple. Sin embargo, TENGA CUIDADO con lo externo en su proyecto SVN. Si hace referencia a bibliotecas externas, la referencia de revisión externa (ya sea una etiqueta, HEAD o número) permanecerá sin cambios cuando etiquete directorios que tengan referencias externas.

Es posible crear una secuencia de comandos para manejar este aspecto de etiquetado, para una discusión sobre este tema, véase el artículo de la presente OS: Tagging an SVN checkout with externals

-3

Prueba esto. Funciona para mí:

mkdir <repos>/tags/Release1.0 
svn commit <repos>/tags/Release1.0 
svn copy <repos>/trunk/* <repos>/tag/Release1.0 
svn commit <repos/tags/Release1.0 -m "Tagging Release1.0" 
+0

Esto definitivamente es una manera incorrecta ir. La etiqueta (Release1.0) debe ser una copia del directorio de origen (trunk), no un directorio creado arbitrariamente. Si lo haces de la forma en que lo hiciste, pierdes el historial del directorio de origen y solo conservas el historial de los nodos descendientes (archivos y directorios). –

11

sólo tiene que utilizar esto:

svn copy http://svn.example.com/project/trunk 
      http://svn.example.com/project/branches/release-1 
      -m "branch for release 1.0" 

(todo en una línea, por supuesto.) Siempre debe realizar una rama de toda la carpeta tronco y contenidos. Por supuesto, es posible ramificar sub partes del tronco, pero esto casi nunca será una buena práctica. Desea que la ramificación se comporte exactamente como lo hace ahora la troncal, y para que eso suceda, debe ramificar toda la troncal.

Ver un mejor resumen del uso de SVN en mi blog: SVN Essentials y SVN Essentials 2

+0

¿Puede explicar cómo debería ser si solo reviso el tronco y estoy dentro con mi script? – aholbreich

+0

Si ha revisado la carpeta troncal, entonces necesita usar la dirección http del repositorio. He actualizado la respuesta para representar esto, ya que revisar la carpeta del tronco es el patrón recomendado. – AgilePro

4

Otra opción para etiquetar un repositorio Subversion es añadir la etiqueta a la propiedad svn: log así:

echo "TAG: your_tag_text" > newlog 
    svn propget $REPO --revprop -r $tagged_revision >> newlog 
    svn propset $REPO --revprop -r $tagged_revision -F newlog 
    rm newlog 

Recientemente comencé a pensar que esta es la forma más "correcta" de etiquetar. De esta manera no se crea las revisiones adicionales (como lo hace con "cp SVN") y todavía se puede extraer fácilmente todas las etiquetas mediante el uso de grep en "svn log" de salida:

svn log | awk '/----/ { 
         expect_rev=1; 
         expect_tag=0; 
        } 
        /^r[[:digit:]]+/ { 
         if(expect_rev) { 
          rev=$1; 
          expect_tag=1; 
          expect_rev=0; 
         } 
        } 
        /^TAG:/ { 
         if(expect_tag) { 
          print "Revision "rev", Tag: "$2; 
         } 
         expect_tag=0; 
        }' 

Además, de esta manera usted puede sin problemas borre las etiquetas si es necesario. Entonces las etiquetas se convierten en una metainformación completa, y me gusta.

Cuestiones relacionadas