Если вы импортируете в существующее хранилище, которое уже содержит несколько проектов, то структура хранилища будет уже вполне определена. Если вы импортируете данные в новое хранилище, то имеет смысл подумать о том, как оно будет организовано. Прочтите «Организация данных в хранилище» для дополнительных рекомендаций.
Этот раздел описывает команду импорта Subversion, которая предназначена для импорта иерархии папок в хранилище за один подход. Несмотря на то, что она это делает, у неё есть несколько недостатков:
Нет способа выбрать включаемые файлы и папки, кроме как применяя настройки глобального исключения.
Импортированная папка не становится рабочей копией. Вы должны выполнить извлечение для копирования файлов обратно с сервера.
Можно легко импортировать совсем на не тот уровень папок в хранилище.
По этим причинам мы рекомендуем, чтобы вы вообще не использовали команду импорта, за исключением, конечно, выполнения двухшагового метода, описанного в «Импорт на месте». Но поскольку вы уже здесь, вот как в основном работает импорт...
Перед тем, как вы импортируете ваш проект в хранилище, вам следует:
Удалить все файлы, которые не нужны для сборки проекта (временные и создаваемые компилятором файлы, такие как *.obj, скомпилированные исполняемые файлы, ...)
Упорядочить файлы в папки и подпапки. Хотя возможно переименовать/переместить файлы и позже, настоятельно рекомендуется, чтобы структура вашего проекта была сформирована перед импортом!
Теперь выберите самую верхнюю папку в структуре папок проекта в Проводнике Windows и сделайте правый щелчок для открытия контекстного меню. Выберите команду → , которая откроет диалоговое окно:
В этом диалоге вы должны ввести URL места в хранилище, в которое вы желаете импортировать проект. Очень важно понять, что сама импортируемая локальная папка в хранилище не появится, только её содержимое. Например, если у вас имеется следующая структура:
C:\Проекты\Widget\source C:\Проекты\Widget\doc C:\Проекты\Widget\images
и вы импортируете C:\Проекты\Widget в http://mydomain.com/svn/trunk, то вы можете быть удивлены, что ваши подпапки попадут непосредственно в ствол, вместо того, чтобы остаться в подпапке Widget. Вам необходимо указать подпапку как часть URL,http://mydomain.com/svn/trunk/Widget-X. Обратите внимание: команда импорта автоматически создаёт подпапки в хранилище, если они не существуют.
Сообщение импорта используется как сообщение журнала.
По умолчанию, файлы и папки, соответствующие глобальным шаблонам игнорирования, не импортируются. Для изменения этого поведения, вы можете использовать флажок Включить игнорируемые файлы. Более детальная информация по установке глобальных шаблонов игнорирования приведена в «Общие настройки».
Как только вы нажмёте , TortoiseSVN импортирует в хранилище полностью всё дерево папок со всеми файлами. Сейчас проект помещён в хранилище под управление версиями. Пожалуйста помните, что та папка, которую вы импортировали, НЕ НАХОДИТСЯ под управлением версиями! Для получения рабочей копии, находящейся под управлением версиями, вы должны произвести извлечение только что импортированной версии. Или продолжайте чтение для того, чтобы узнать как импортировать папку на месте.
Предполагая, что хранилище уже у вас есть, и вы желаете добавить в него новую папку со всей её структурой, просто выполните следующие шаги:
При помощи обозревателя хранилища создайте новую папку проекта непосредственно в хранилище.
Извлеките эту новую папку поверх той папки, которую вы желаете импортировать. Появится предупреждение о том, что локальная папка не пуста. Теперь у вас есть версированная папка верхнего уровня с неверсированным содержимым.
Воспользуйтесь командой → на новой версированной папке для добавления части или всего содержимого. Вы можете добавлять и убирать файлы, задавать свойства svn:ignore для папок и производить любые другие необходимые вам изменения.
Зафиксируйте папку верхнего уровня, и у вас получится новое версированное дерево и локальная рабочая копия, созданная из вашей существующей папки.
Иногда вам необходимо внести под управление версиями файл с данными, отличающимися для каждого пользователя. Это означает, что у вас есть файл, который каждый разработчик/пользователь должен изменить для соответствия собственным настройкам. Но версирование такого рода файлов затруднено, поскольку каждый пользователь будет каждый раз фиксировать свои изменения в хранилище.
В таких случаях мы предлагаем использовать шаблонные файлы. Вы создаёте файл, содержащий все необходимые разработчикам данные, добавляете этот файл под управление версиями и пусть разработчики извлекают этот файл. После извлечения каждый разработчик должен сделать копию этого файла и переименовать созданную копию, после чего эту копию можно изменять без проблем.
Например, вы можете посмотреть на скрипт сборки TortoiseSVN. Он вызывает файл с именем TortoiseVars.bat, который не существует в хранилище - только TortoiseVars.tmpl. TortoiseVars.tmpl - это шаблон файла, который каждый разработчик получает из хранилища и переименовывает его в TortoiseVars.bat. Внутри этого файла мы поместили комментарии, так что пользователи видят, какие строки они должны отредактировать и изменить в соответствии с их локальными настройками, чтобы это заработало.
И чтобы не сбивать с толку пользователей, мы также добавили файл TortoiseVars.bat в список игнорирования для его родительской папки, т.е. мы устанавливаем свойство Subversion svn:ignore так, чтобы оно включало это имя файла. Таким образом, оно не показывается как неверсированное при каждой фиксации.
Иногда бывает полезно создать рабочую копию, включающую несколько частей, извлечённых из различных источников. Например, вы можете пожелать, чтобы различные папки соответствовали разным местоположениям в хранилище, или, возможно, были вообще из различных хранилищ. Если вы хотите, чтобы у каждого пользователя была такая же компоновка, вы можете определить свойства svn:externals.
Предположим, вы извлекаете рабочую копию /project1 в D:\dev\project1. Выберите папку D:\dev\project1, сделайте правый щелчок и выберите → в контекстном меню. Появится диалог 'Свойства'. Перейдите на вкладку Subversion. Здесь есть кнопка , вызывающая диалог работы со свойствами. После появления диалога нажмите кнопку и выберите свойство svn:externals из выпадающего списка, после чего введите URL адрес хранилища в формате имя url или, если вы желаете указать конкретную ревизию, имя -rREV url. Вы можете добавить несколько внешних проектов, по одному в строке. Обратите внимание, что некоторые символы в URL должны быть правильно заэкранированы, иначе они не будут правильно работать. Например, вы должны заменить каждый пробел на %20. Обратите внимание: невозможно использование имён папок, содержащих пробелы. Допустим, вы установили это свойство для 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
Нажмите на и зафиксируйте ваши изменения. Когда вы (или кто-либо другой) обновите вашу рабочую копию, Subversion создаст подпапку D:\dev\project1\sounds и извлечёт проект sounds, другая подпапка D:\dev\project1\quick graphs будет содержать проект графики, и, наконец, вложенная подпапка D:\dev\project1\skins\toolkit будет содержать ревизию 21 проекта skin-maker.
Вы должны серьёзно рассмотреть использование явного номера ревизии во всех ваших определениях внешних включений, как описано выше. Применение этого подхода означает, что решение, когда скачивать другую копию внешней информации, и какую конкретно копию, будете принимать вы. Помимо соображений здравого смысла, заключающихся в том, чтобы вы не будете неприятно удивлены изменениями в стороннем хранилище, управлять которым у вас нет возможности, использование явных номеров ревизий означает также, что при возвращении вашей рабочей копии к предыдущей ревизии определения внешних включений тоже вернутся к тому, какими они были в предыдущей ревизии, что, в свою очередь, означает, что внешние рабочие копии будут обновлены до того состояния, в котором они были тогда, когда ваше хранилище было на этой предыдущей ревизии. Для программных проектов это может означать разницу между успешной и не успешной сборкой старого снимка состояния вашей сложной базы исходного кода.
Если внешний проект находится в том же хранилище, то любые изменения, которые вы в нём сделаете, будут включены в список фиксации при фиксировании основного проекта.
Если внешний проект находится в другом хранилище, вы будете уведомлены о сделанных вами изменениях во внешнем проекте при фиксировании основного проекта, но вы должны будете зафиксировать эти внешние изменения отдельно.
Если вы используете абсолютные 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.
Если вам необходимо больше информации о том, как TortoiseSVN обходится со свойствами, прочтите раздел «Установки проекта».
Для того, чтобы узнать о различных методах доступа к общим подпроектам, прочтите «Включить общий подпроект».