Repositorios externos

A veces resulta útil construir una copia de trabajo local compuesta a partir de varias. Por ejemplo, podría querer que diferentes subdirectorios provengan de repositorios completamente diferentes. Decididamente puede configurar tal escenario a mano—usando svn checkout para crear una copia local con la estructura anidada que intenta alcanzar. Pero si esta estructura es importante para cualquiera que use el repositorio, cualquier otro usuario necesitará realizar las mismas operaciones de obtención de copias locales que usted hizo.

Afortunadamente, Subversion proporciona soporte de definiciones externas. Una definición externa es la relación de un directorio local con la URL—y posiblemente una revisión particular—de un recurso versionado. En Subversion, declara definiciones externas en grupos usando la propiedad svn:externals. Puede crear o modificar esta propiedad usando los comandos svn propset o svn propedit (vea “¿Por qué propiedades?”). Puede ser ajustada en un directorio versionado, y su valor es una tabla multi línea de subdirectorios (relativos al directorio versionado sobre el cual se pone la propiedad) y URLs de repositorios Subversion absolutas, completamente cualificadas.

$ svn propget svn:externals calc
third-party/sounds             http://sounds.red-bean.com/repos
third-party/skins              http://skins.red-bean.com/repositories/skinproj
third-party/skins/toolkit -r21 http://svn.red-bean.com/repos/skin-maker

La conveniencia de la propiedad svn:externals es que una vez ha sido ajustada en un directorio versionado, cualquiera que obtenga una copia local de trabajo de ese directorio, también obtendrá el beneficio de la definición externa. En otras palabras, una vez que una persona ha realizado el esfuerzo de definir esa estructura anidada de direcciones de repositorios, nadie más tiene que volver a repetirlo—ya que Subversion, a la hora de obtener una copia local, también obtendrá una copia de los repositorios externos.

Fíjese en la definición externa del ejemplo anterior. Cuando alguien obtenga la copia local del directorio calc, Subversion continuará obteniendo copias locales de los elementos indicados por las definiciones externas.

$ svn checkout http://svn.example.com/repos/calc
A  calc
A  calc/Makefile
A  calc/integer.c
A  calc/button.c
Checked out revision 148.

Fetching external item into calc/third-party/sounds
A  calc/third-party/sounds/ding.ogg
A  calc/third-party/sounds/dong.ogg
A  calc/third-party/sounds/clang.ogg
…
A  calc/third-party/sounds/bang.ogg
A  calc/third-party/sounds/twang.ogg
Checked out revision 14.

Fetching external item into calc/third-party/skins
…

Si necesita cambiar las definiciones externas, puede hacerlo usando los subcomandos habituales de modificación de propiedades. Cuando envíe un cambio al repositorio de la propiedad svn:externals, Subversion sincronizará las copias locales obtenidas contra las definiciones externas la siguiente vez que ejecute svn update. Lo mismo ocurrirá cuando otras personas actualicen sus copias locales y obtengan sus cambios sobre las definiciones externas.

El comando svn status también reconoce definiciones externas, mostrando el código de estado X para los subdirectorios disjuntos en los cuales se almacenarán las copias locales, entrando después de manera recursiva en estos directorios para mostrar el estado de los propios elementos externos.

No obstante, el soporte de definiciones externas que hay hoy en Subversion puede ser ligeramente engañoso. Las copias locales creadas vía definición externa todavía están desconectadas de la copia local de trabajo primaria (en cuyos directorios versionados ajustó la propiedad svn:externals). Y Subversion todavía funciona solamente sobre copias locales no disjuntas. Así que, por ejemplo, si quiere enviar cambios al repositorio realizados en una o más de esas copias locales externas, debe ejecutar el comando svn commit de forma explícita en esas copias locales—enviar los cambios de la copia local de trabajo primaria no recurrirá en las copias externas.

Además, dado que las propias definiciones son URLs absolutas, mover o copiar el directorio sobre el cual están fijadas no afectará a aquello que se obtiene como copia externa (aunque, claro está, el directorio local relativo indicado será movido con el directorio renombrado). Esto puede ser confuso—incluso frustrante—en ciertas situaciones. Por ejemplo, si usa la definición externa sobre un directorio en su línea de desarrollo principal (/trunk) apuntando a otras áreas de la misma línea, y entonces usa svn copy para crear una rama de esa línea en /branches/my-branch, la definición externa sobre los elementos en su nueva rama todavía se referirán a los recursos versionados en /trunk. Además, tenga en cuenta que si necesita reubicar su copia local de trabajo (usando svn switch --relocate), las definiciones externas no serán reubicadas.