Внешние включения

Иногда бывает полезно создать рабочую копию, состоящую из нескольких частей, извлечённых из различных источников. Например, бывает необходимо собрать различные файлы или папки из разных мест хранилища, или, возможно, вообще из различных хранилищ. Если вы желаете, чтобы у всех пользователей была одинаковая компоновка, вы можете определить свойства svn:externals, чтобы разместить указанные ресурсы в тех местах, где они нужны.

Внешние папки

Скажем вы извлекаете рабочую копию проекта /project1 в D:\dev\project1. Выберите папку D:\dev\project1, сделайте правый клик и выберите меню WindowsСвойства из контекстного меню. Появляется диалог Свойства. Перейдите на вкладку 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.

Создание внешних включений с помощью перетаскивания (drag-and-drop)

Если у вас уже есть рабочая копия с файлами и папками, которые вы хотите добавить как внешнее включение в другую рабочую копию, то просто добавьте их с помощью перетаскивания из проводника Windows.

Просто перетяните правой кнопкой мыши файл или папку из одной рабочей копии туда, куда вы хотите их добавить как внешнее включение. При отпускании кнопки мыши появится контекстное меню: SVN Добавить сюда как внешнее. Если вы кликнете на этом пункте меню, то автоматически будет добавлено свойство svn:externals. Всё что вам нужно сделать после этого — зафиксировать изменения свойства и обновить, чтобы эти внешние включения правильно добавились в рабочую копию.