tag - ¿Cómo crear correctamente una etiqueta SVN desde el tronco?
diferencia entre tag y branch svn (8)
Estoy creando mi primer proyecto en Subversion . Hasta ahora tengo
branches
tags
trunk
Creo que inmediatamente necesito hacer ramas singulares y empezar de nuevo. Actualizar sucursales es la norma.
He estado trabajando en troncales y moviendo los contenidos 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 incorrecto, y debo mantener alguna relación entre los archivos usando svn copy
. Los archivos que cree de esta manera no tendrán relación entre sí, 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 todo el directorio?
svn copy cp -rf trunk tags/1.0
svn commit -m " create a first tagged version"
@victor hugo y @unwind son correctos, y la solución de victor es, con mucho, la más simple. Sin embargo, tenga cuidado con los aspectos externos en su proyecto SVN. Si hace referencia a bibliotecas externas, la referencia de revisión externa (ya sea una etiqueta, HEAD o número) no se modificará cuando etiquete directorios que tengan referencias externas.
Es posible crear una secuencia de comandos para manejar este aspecto del etiquetado; para una discusión sobre ese tema, consulte este artículo SO: Etiquetar un proceso de pago de SVN con elementos externos
Como lo señaló @victor hugo, la forma "adecuada" 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 en sí misma. Entonces, si su sistema de compilación utiliza svn revision de alguna manera (por ejemplo, incorpora el número obtenido con ''svn info'' en la versión del producto que usted construye), entonces no podrá compilar exactamente el mismo producto a partir de una etiqueta (la El resultado tendrá la revisión de la etiqueta en lugar de la del código original).
Parece que por diseño no hay forma en svn de crear una metaetiqueta realmente apropiada.
Otra opción para etiquetar un repositorio de Subversion es agregar la etiqueta a la propiedad svn: log de esta manera:
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 crea revisiones adicionales (como lo hace con "svn cp") y aún puede extraer fácilmente todas las etiquetas usando grep en la salida de "svn log":
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 puede eliminar las etiquetas sin problemas si lo necesita. Así que las etiquetas se convierten en una meta-información completa, y me gusta.
Podría usar la tortuga:
http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-branchtag.html
Prueba esto. Esto funciona para mi:
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"
Solo usa 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 hacer una rama de toda la carpeta troncal y los contenidos. Por supuesto, es posible dividir las partes del tronco, pero esto casi nunca será una buena práctica. Desea que la rama se comporte exactamente como lo hace el tronco ahora, y para que eso suceda, tiene que ramificar todo el tronco.
Vea un mejor resumen del uso de SVN en mi blog: SVN Essentials y SVN Essentials 2
Tienes razón en que no es "correcto" agregar archivos a la carpeta de etiquetas.
Has adivinado correctamente que la copy
es la operación a utilizar; le permite a Subversion hacer 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 desde la ubicación de extracción de raíz. De esa manera, la instantánea puede valerse por sí misma, como una representación real del estado de todo el proyecto en un momento determinado.
Esta parte de "el libro" muestra cómo se usa normalmente el comando.
Utilizar:
svn copy http://svn.example.com/project/trunk /
http://svn.example.com/project/tags/1.0 -m "Release 1.0"
Taquigrafía:
cd /path/to/project
svn copy ^/trunk ^/tags/1.0 -m "Release 1.0"