Importando datos en un repositorio

Importar

Si está importando en un repositorio que ya tiene algunos proyectos, entonces la estructura del repositorio ya estará decidida. Si está importando datos a un nuevo repositorio entonces merece la pena tomar el tiempo para pensar en cómo debería organizarse. Lea “Organización del repositorio” para más información.

Esta sección describe el comando importar de Subversion, que fue diseñado para importar una jerarquía de directorios en el repositorio de una vez. Aunque funciona, tiene algunos inconvenientes:

  • No hay forma de seleccionar los ficheros y carpetas a incluir, salvo si utiliza la configuración del patrón global de ignorar.

  • La carpeta importada no se convierte en una copia de trabajo. Tiene que hacer una obtención para copiar los ficheros de nuevo desde el servidor.

  • Es fácil importar en un nivel de carpetas erróneo en el repositorio.

Por estas razones le recomendamos que no utilice el comando importar en absoluto, y en cambio siga el método de dos pasos descrito en “Importar en el sitio”. Pero dado que ya está aquí, así es como funciona el comando importar básico ...

Antes de importar su proyecto en un repositorio debería:

  1. Quitar todos los ficheros que no se necesitan para construir el proyecto (ficheros temporales, ficheros que se generan por un compilador como los *.obj, binarios compilados, ...)

  2. Organizar los ficheros en carpetas y subcarpetas. Aunque es posible renombrar/mover los ficheros más tarde, ¡es muy recomendable que tenga la estructura del proyecto antes de importarlo!

Ahora seleccione la carpeta superior de la estructura de directorios del proyecto en el explorador de Windows, y haga click con el botón derecho para abrir el menú contextual. Seleccione el comando TortoiseSVNImportar... y aparecerá un cuadro de diálogo:

Figura 5.6. El diálogo Importar

El diálogo Importar


En este diálogo tiene que introducir la URL del lugar del repositorio donde desea importar su proyecto. Es muy importante darse cuenta de que la carpeta local que está importando no aparece en sí misma en el repositorio, sólo su contenido. Por ejemplo, si tiene una estructura:

C:\Proyectos\Widget\source
C:\Proyectos\Widget\doc
C:\Proyectos\Widget\images

e importa C:\Proyectos\Widget en http://mydomain.com/svn/trunk entonces puede que se sorprenda al encontrar que sus subdirectorios van directos a trunk en vez de estar en un subdirectorio Widget. Necesita especificar el subdirectorio como parte de la URL, http://mydomain.com/svn/trunk/Widget-X. Tenga en cuenta que el comando importar automáticamente crea los subdirectorios en el repositorio si no existen.

El mensaje de importación se utiliza como un mensaje de registro.

Por defecto, los ficheros y carpetas que concuerden con los patrones globales de ignorar no se importan. Para cambiar este comportamiento, puede utilizar la casilla Incluir ficheros ignorados. Lea “Configuración general” para más información sobre cómo establecer un patrón global de ignorar.

Tan pronto como presione Aceptar, TortoiseSVN importa el árbol completo de directorios, incluyendo todos los ficheros, en el repositorio. El proyecto ahora está almacenado en el repositorio bajo el control de versiones. Por favor tenga en cuenta que la carpeta que ha importado ¡NO está bajo el control de versiones! Para obtener una copia de trabajo bajo el control de versiones necesita Obtener la versión que acaba de importar. O siga leyendo para averiguar cómo importar una carpeta en el sitio.

Importar en el sitio

Asumiendo que ya tiene un repositorio, y que quiere añadir una nueva estructura de carpetas e él, sólo tiene que seguir estos pasos:

  1. Utilice el navegador de repositorios para crear nuevas carpetas de proyecto directamente en el repositorio.

  2. Ejecute la operación obtener de la nueva carpeta sobre la carpeta de más alto nivel que desea importar. Obtendrá una advertencia porque la carpeta local no está vacía. Ahora tiene una carpeta de más alto nivel versionada con contenido no versionado.

  3. Utilice TortoiseSVNAñadir... en esta carpeta versionada para añadir parte o todo su contenido. Puede añadir y eliminar ficheros, establecer las propiedades svn:ignore en las carpetas y hacer cualquier otro cambio que necesite.

  4. Confirme la carpeta de más alto nivel, y ya tiene un nuevo árbol versionado, y una copia de trabajo local, creada desde su carpeta existente.

Ficheros especiales

A veces necesitará tener un fichero bajo control de versiones que contenga datos específicos del usuario. Esto significa que tiene un fichero que cada desarrollador/usuario necesita modificar para que se ajuste a su configuración local. Pero versionar ese fichero es dificil, porque cada usuario haría confirmaciones de sus cambios cada vez en el repositorio.

En estos casos le sugerimos que utilice ficheros plantilla. Cree un fichero que contenga todos los datos que sus desarrolladores puedan necesitar, añádalo al control de versiones y haga que sus desarrolladores lo obtengan. Luego, cada desarrollador tendrá que hacer una copia de ese fichero y renombrar esa copia. Después de eso, modificar la copia no vuelve a ser un problema.

Por poner un ejemplo, puede mirar el script de compilación de TortoiseSVN. Se invoca a un fichero llamado TortoiseVars.bat que no existe en el repositorio. Sólo existe el fichero TortoiseVars.tmpl. TortoiseVars.tmpl es el fichero plantilla del que cada desarrollador tiene que hacer una copia y cambiarla de nombre a TortoiseVars.bat. Dentro de ese fichero, hemos añadido comentarios para que los usuarios vean qué lineas tienen que editar y cambiar de acuerdo a sus configuraciones locales para que funcione.

Para no molestar a los usuarios, también hemos añadido el fichero TortoiseVars.bat a la lista de ignorados de su carpeta padre, es decir, hemos cambiado la propiedad de Subversion svn:ignore para incluir ese nombre de fichero. De esta forma no se mostrará como no versionado en cada confirmación.

Proyectos referenciados

A veces es útil construir una copia de trabajo que está hecho de un número de obtenciones diferentes. Por ejemplo, puede querer que diferentes carpetas vengan de orígenes distintos de un repositorio, o quizás de repositorios diferentes. Si desea que todos los usuarios tengan la misma estructura, puede definir propiedades svn:externals.

Digamos que obtiene una copia de trabajo de /project1 en D:\dev\project1. Seleccione la carpeta D:\dev\project1, haga click con el botón derecho y seleccione Menú de WindowsPropiedades del menú contextual. Aparece el diálogo Propiedades. Vaya a la pestaña de Subversion. Allí puede establecer las propiedades. Pulse Añadir.... Seleccione la propiedad svn:externals del desplegable y escriba en el cuadro de edición la URL del repositorio con el formato nombre url o, si desea especificar una revisión en concreto, name -rREV url. Puede añadir múltiples proyectos externos, uno por línea. Tenga en cuenta que las URLs deben estar correctamente codificadas o no funcionarán bien. Por ejemplo, debe reemplazar cada espacio por %20. Tenga en cuenta que no es posible utiilzar nombres de carpetas con espacios en ellos. Suponga que ha establecido estas propiedades en D:\dev\project1:

sounds   http://sounds.red-bean.com/repos
quick_graphs  http://graphics.red-bean.com/repos/fast%20graphics
skins/toolkit -r21 http://svn.red-bean.com/repos/skin-maker

Ahora pulse Establecer y confirme sus cambios. Cuando usted (o cualquier otro usuario) actualice su copia de trabajo, Subversion creará una subcarpeta D:\dev\project1\sounds y obtendrá el proyecto sounds, otra subcarpeta D:\dev\project1\quick graphs que contendrá el proyecto graphics, y finalmente una subcarpeta anidada D:\dev\project1\skins\toolkit que contiene la revisión 21 del proyecto skin-maker.

Sugerencia

Debería considerar seriamente utilizar números de revisión explícitos en todas sus definiciones de externos, como se describe anteriormente. Hacerlo significa que tiene que decidir cuándo utilizar una instantánea diferente de información externa, y exáctamente qué instantánea utilizar. Además del aspecto de sentido común de no ser sorprendido por cambios en repositorios de terceras partes sobre los que puede que no tenga control, utilizar números de revisión explícitos también significa que cuando retroceda su copia de trabajo a una revisión anterior, sus definiciones externas también se revertiran a la forma a la que tenían en esa revisión, lo que a su vez significa que las copias de trabajo externas se actualizarán para concordar en la forma en la que ellas tenían cuando su repositorio estaba en esa revisión anterior. Para proyectos de software, esto puede ser la diferencia entre una compilación válida o fallida de una vieja intentánea de su complejo código.

Si los proyectos externos están en el mismo repositorio, cualquier cambio que haga allí se incluirá en la lista de confirmación cuando confirme su proyecto principal.

Si los proyectos externos están en repositorios diferentes, cualquier cambio que haga en el proyecto externo se notificará cuando cnofirme el proyecto principal, pero tendrá que confirmar esos cambios externos de forma separada.

Si utiliza URLs absolutas en las definiciones svn:externals y tiene que relocalizar su copia de trabajo (por ejemplo si la URL de su repositorio cambia), entonces sus externos no cambiarán y puede que no funcionen más.

Para evitar dichos problemas, los clientes de Subversion versión 1.5 y superior soportan URLs externas relativas. Hay cuatro formas para especificar una URL relativa. En los siguientes ejemplos, asumimos que tenemos dos repositorios: uno en http://example.com/svn/repos-1 y otro en http://example.com/svn/repos-2. Tenemos una copia de trabajo de http://example.com/svn/repos-1/project/trunk en C:\Working y la propiedad svn:externals está establecida en trunk.

Relativa a la carpeta padre

Estas URLs siempre comienzan con la cadena ../. Por ejemplo:

../../widgets/foo  common/foo-widget

Esto extraerá http://example.com/svn/repos-1/widgets/foo en C:\Working\common\foo-widget.

Tenga en cuenta que la URL es relativa a la URL del directorio con la propiedad svn:externals, no al directorio donde la carpeta externa se escribe en el disco.

Relativo a la raíz del repositorio

Estas URLs siempre comienzan con la cadena ^/. Por ejemplo:

^/widgets/foo  common/foo-widget

Esto extraerá http://example.com/svn/repos-1/widgets/foo en C:\Working\common\foo-widget.

Puede referirse fácilmente a otros repositorios con el mismo SVNParentPath (un directorio común que contiene varios repositorios). Por ejempo:

^/../repos-2/hammers/claw  common/claw-hammer

Esto extraerá http://example.com/svn/repos-2/hammers/claw en C:\Working\common\claw-hammer.

Relativa al esquema

Las URLs que comienzan con la cadena // copian sólo la parte del esquema de la URL. Esto es útil cuando se debe acceder al mismo nombre de servidor con diferentes esquemas dependiendo de la red; por ejemplo los clientes en la intranet utilizan http:// mientras que los clientes externos utilizan svn+ssh://. Por ejemplo:

//example.com/svn/repos-1/widgets/foo  common/foo-widget

Esto extraerá http://example.com/svn/repos-1/widgets/foo o svn+ssh://example.com/svn/repos-1/widgets/foo dependiendo de qué método se utilice para obtener C:\Working.

Relativa al nombre del servidor

Las URLs que comienzan con la cadena / copian el esquema y el nombre del servidor de la URL, por ejemplo:

/svn/repos-1/widgets/foo  common/foo-widget

Esto extraerá http://example.com/svn/repos-1/widgets/foo en C:\Working\common\foo-widget. Pero si obtiene su copia de trabajo desde otro servidor en svn+ssh://another.mirror.net/svn/repos-1/project1/trunk entonces la referencia externa extraerá svn+ssh://another.mirror.net/svn/repos-1/widgets/foo.

Si necesita más información sobre cómo TortoiseSVN maneja las Propiedades, lea “Configuración del proyecto”.

Para averiguar los diferentes métodos para acceder a subproyectos comunes lea “Incluir un sub-proyecto común”.