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.