Иногда необходимо разделить хранилище Subversion, и перенести его на другой сервер. Задача решаема, хотя и с некоторыми трудностями. Решить ее удалось на основании этой статьи.
Но как всегда, возникли нюансы.
Но давайте по порядку. Пускай у нас был проект по адресу http://server/svn/Root/Projects/XYProject, а физически хранилище располагалось на F:\Repositories\Root. Задача был заключалась в том, чтобы вырезать проект XYProject со всей историей, и перенести в новое хранилище.
1. Создать дамп хранилища:
а также найти строки вида (создание папки для вашего проекта), и удалить их.
Node-path: Projects/XYProject/trunk
Node-action: add
Node-kind: dir
Prop-content-length: 10
Content-length: 10
PROPS-END
4. Импорт исправленного дампа на сервер.
Если вы всё правильно сделали на предыдущих шагах, то проблем возникнуть не должно, и вся история ваших изменений ляжет на новый сервер.
Но как всегда, возникли нюансы.
Но давайте по порядку. Пускай у нас был проект по адресу 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
Дальше нужно отфильтровать дамп по нужному нам пути, что делается командой 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Если вы всё правильно сделали на предыдущих шагах, то проблем возникнуть не должно, и вся история ваших изменений ляжет на новый сервер.