Страницы

понедельник, 14 февраля 2011 г.

Как разделить репозиторий Subversion

Иногда необходимо разделить хранилище Subversion, и перенести его на другой сервер. Задача решаема, хотя и с некоторыми трудностями. Решить ее удалось на основании этой статьи.
Но как всегда, возникли нюансы.
Но давайте по порядку. Пускай у нас был проект по адресу http://server/svn/Root/Projects/XYProject, а физически хранилище располагалось на F:\Repositories\Root. Задача был заключалась в том, чтобы вырезать проект XYProject со всей историей, и перенести в новое хранилище.
1. Создать дамп хранилища:   

   svnadmin dump F:\Repositories\Root > fullrepo.dump 
Команда отработала без ошибок, через пару минут дамп был готов для дальнейших опытов.


2.Отфильтровать дамп

Дальше нужно отфильтровать дамп по нужному нам пути, что делается командой svndumpfilter. Команда замечательно работала, но отфильтровывала вообще всё. Поковырявшись в дамп (он в простом текстовом формате), удалось написать правильную строку для фильтра.

   svndumpfilter include /Projects/XYProject/trunk < f:\fullrepo.dump > f:\XYProject.dump

Итак, есть готовый отфильтрованный дамп. Дело за малым, выполнить 3-ю рекомендацию статьи: исправить пути, и удалить запись о создании корневого каталога.

3. Исправить пути, и удалить запись о создании корневой папки

Не буду описывать свои попытки заставить работать sed на Windows, но у меня это так и не получилось. От 100Мб файла он оставлял 10-15Кб. В итоге сделал тоже самое через старый добрый notepad++.
Итак, что надо сделать: 

найти все строки пути вида

Node-path: Projects/XYProject/trunk/XYProject.Presentation
Node-copyfrom-path: Projects/XYProject/trunk/XYProject.Presentation/Class1.cs

заменить соответственно на:

Node-path: trunk/XYProject.Presentation
Node-copyfrom-path: trunk/XYProject.Presentation/Class1.cs

а также найти строки вида (создание папки для вашего проекта), и удалить их.

Node-path: Projects/XYProject/trunk
Node-action: add
Node-kind: dir
Prop-content-length: 10
Content-length: 10

PROPS-END

4. Импорт исправленного дампа на сервер. 

svnadmin load D:\Repositories\XYProject < f:\XYProject.dump


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



PS. Для эстетов
Фильтрованный дамп может содержать записи такого вида: 
Revision-number: 260
Prop-content-length: 112
Content-length: 112

K 7
svn:log
V 38
This is an empty revision for padding.
K 8
svn:date
V 27
2010-05-21T09:11:40.518778Z
PROPS-END

Это те ревизии, которые не затрагивали ваш проект. Удалять их скорее всего можно, но есть нюансы... После удаление одной из них, у меня не работал svnadmin load, падая с ошибкой "Could not find path..." Расследование привело к таким строкам в дампе:

Node-path: trunk/XYProject/Execution/IEnvironment.cs
Text-content-md5: 4f36e6c3d95f425070c8d293cce2f032
Node-action: add
Text-copy-source-sha1: 0920e5efb45babfa3b6b9ac90559554d73791910
Text-content-sha1: 8fdedf34b0b97e45dc167d3bb7fe150cb1c03482
Node-kind: file
Node-copyfrom-rev: 260
Node-copyfrom-path: trunk/XYProject.Presentation/IEnvironment.cs
Text-copy-source-md5: 8a5619b3cf1d141542b78959951220e1
Text-content-length: 531
Content-length: 531

Так и не смог понять, почему скопировано из ревизии, в которой ничего из проекта не затрагивалось. В итоге оставил эту ревизию 260, и всё замечательно втянулось в новое хранилище.

Комментариев нет:

Отправить комментарий