Иногда бывает полезно создать рабочую копию, состоящую из нескольких частей, извлечённых из различных источников. Например, бывает необходимо собрать различные файлы или папки из разных мест хранилища, или, возможно, вообще из различных хранилищ. Если вы желаете, чтобы у всех пользователей была одинаковая компоновка, вы можете определить свойства svn:externals
, чтобы разместить указанные ресурсы в тех местах, где они нужны.
Скажем вы извлекаете рабочую копию проекта /project1
в D:\dev\project1
. Выберите папку D:\dev\project1
, сделайте правый клик и выберите → из контекстного меню. Появляется диалог Свойства. Перейдите на вкладку Subversion. Там вы можете установить свойства. Нажмите . В диалоге свойств, либо кликните дважды на svn:externals
если есть, либо нажмите на кнопку и выберите внешнее
из меню. Для добавления новой внешней ссылки нажмите на кнопке и заполните требуемую информацию в появившемся диалоге.
Адреса URL должны быть правильно экранированы иначе они не будут работать, т. е. вы должны заменить каждый пробел на %20
.
Если вы желаете, чтобы локальные пути включали пробелы или другие специальные символы, вы можете заключить их в двойные кавычки, или использовать перед специальным символом символ \
(обратную косую черту) для экранирования в стиле оболочки Unix. Конечно же, это также означает, что вы должны использовать /
(прямую косую черту) в качестве разделителя пути. Обратите внимание: такое поведение появилось в Subversion 1.6 и это не будет работать с более старыми клиентами.
Вы должны серьёзно рассмотреть использование явных номеров ревизии во всех ваших определениях внешних включений, как описано выше. Применение этого "подхода означает, что вы будете решать, когда скачивать другую копию внешней информации, и какую конкретно копию. Помимо соображений здравого смысла, заключающихся в том, чтобы вы не будете неприятно удивлены изменениями в стороннем хранилище, управлять которым у вас нет возможности, использование явных номеров ревизий означает также, что при возвращении вашей рабочей копии к предыдущей ревизии определения внешних включений тоже вернутся к тому, какими они были в предыдущей ревизии, что, в свою очередь, означает, что внешние рабочие копии будут обновлены до того состояния, в котором они были тогда, когда ваше хранилище было на этой предыдущей ревизии. Для программных проектов это может означать разницу между успешной и не успешной сборкой старого снимка состояния вашей сложной базы исходного кода.
Диалог редактирования свойств svn:externals
позволяет вам выбрать внешние определения и автоматически установить их явно на ревизию HEAD.
Если внешний проект находится в том же хранилище, то любые изменения в нем будут добавлены в список фиксации, когда вы будете фиксировать ваш главный проект.
Если внешний проект находится в другом хранилище, любые изменения, внесенные во внешний проект будут показаны или указаны, когда Вы фиксируете основной проект, но Вам следует зафиксировать эти внешние изменения отдельно.
Если вы используете абсолютные URL в определениях svn:externals
, и вам надо перебазировать вашу рабочую копию (т.е. URL вашего хранилища изменяется), то внешние включения не изменятся и возможно, больше работать не будут.
Во избежание таких проблем, клиенты Subversion, начиная с версии 1.5, поддерживают относительные внешние URL. Реализовано четыре метода указания относительных URL. В следующих примерах предполагается, что у нас есть два хранилища: одно по адресу http://example.com/svn/repos-1
и другое по адресу http://example.com/svn/repos-2
. У нас есть извлечено http://example.com/svn/repos-1/project/trunk
в C:\Working
и свойство svn:externals
установлено для ствола.
Такие URL всегда начинаются со строки ../
, например:
../../widgets/foo common/foo-widget
Это будет извлекать http://example.com/svn/repos-1/widgets/foo
в C:\Working\common\foo-widget
.
Обратите внимание: URL указывается относительно URL папки со свойством svn:externals
, а не папки, в которой внешнее записывается на диск.
Такие URL всегда начинаются со строки ^/
, например:
^/widgets/foo common/foo-widget
Это извлечёт http://example.com/svn/repos-1/widgets/foo
в C:\Working\common\foo-widget
.
Вы можете легко делать ссылки на другие хранилища с таким же SVNParentPath
(общая папка, содержащая несколько хранилищ). Например:
^/../repos-2/hammers/claw common/claw-hammer
Это будет извлекать http://example.com/svn/repos-2/hammers/claw
в C:\Working\common\claw-hammer
.
URL, начинающиеся о строки //
копируют только часть, относящуюся к схеме URL. Это может пригодится, когда к одному и тому же серверу необходимо получать доступ по разным схемам в зависимости от местоположения в сети; например, клиенты в интранет используют http://
, тогда как внешние клиенты используют svn+ssh://
. Например:
//example.com/svn/repos-1/widgets/foo common/foo-widget
Это будет извлекать http://example.com/svn/repos-1/widgets/foo
или svn+ssh://example.com/svn/repos-1/widgets/foo
в зависимости от того, какой метод был использован для извлечения C:\Working
.
URL, начинающиеся со строки /
копируют часть URL, содержащую схему и имя сервера, например:
/svn/repos-1/widgets/foo common/foo-widget
Это будет извлекать http://example.com/svn/repos-1/widgets/foo
в C:\Working\common\foo-widget
. Но, если извлечь рабочую копию с другого сервера по адресу svn+ssh://another.mirror.net/svn/repos-1/project1/trunk
, то внешнее включение будет извлекать svn+ssh://another.mirror.net/svn/repos-1/widgets/foo
.
Если необходимо вы также можете указать опорную (peg) и оперативную ревизию для адреса URL. Чтобы больше узнать об опорных (peg) и оперативных ревизиях прочитайте, пожалуйста, соответствующую главу в книге о Subversion.
Если вы укажете папку назначения для внешних включений как подпапку, как в приведённых выше примерах, убедитесь, что все папки межу ними также версионируемые. Так для вышеприведённых примеров папка common
должна быть версионируемой!
Несмотря на то, что внешние включения будут работать правильно в большинстве случаев, если папки между ними неверсируемые, всё же есть несколько операций, которые не будут работать как вы ожидаете. И статус оверлейных значков также не будет отображаться корректно.
Если вам необходимо больше информации о том, как TortoiseSVN обходится со свойствами, прочтите раздел «Установки проекта».
Для того, чтобы узнать о различных методах доступа к общим подпроектам, прочтите «Включить общий подпроект».
Начиная с Subversion 1.6, вы можете добавлять отдельные внешние файловые включения в вашу рабочую копию, используя тот же синтаксис, что и для папок. Однако, есть некоторые ограничения.
Путь к внешнему файлу должен быть прямым потомком папки, которая задана в свойстве svn:externals
.
URL внешнего файлового включения должен вести в то же хранилище, в которое внешнее файловое включение будет вставлено; между-хранилищные внешние файловые включения не поддерживаются.
Внешнее файловое включение ведёт себя во многом как любой другой версированный файл, но оно не может быть перемещено или удалено при помощи обычных команд; вместо этого должно быть изменено свойство svn:externals
.
Если у вас уже есть рабочая копия с файлами и папками, которые вы хотите добавить как внешнее включение в другую рабочую копию, то просто добавьте их с помощью перетаскивания из проводника Windows.
Просто перетяните правой кнопкой мыши файл или папку из одной рабочей копии туда, куда вы хотите их добавить как внешнее включение. При отпускании кнопки мыши появится контекстное меню: . Если вы кликнете на этом пункте меню, то автоматически будет добавлено свойство svn:externals
. Всё что вам нужно сделать после этого — зафиксировать изменения свойства и обновить, чтобы эти внешние включения правильно добавились в рабочую копию.