Могу ли я переместить существующий репозиторий Subversion в новый родительский репозиторий (и сохранить историю)?

В настоящее время у меня есть репозиторий корневого уровня для каждого проекта, например:

Project1
Project2
Project3
Project5
Project5

Я хотел бы реорганизовать это так, чтобы вместо репозитория для каждого отдельного проекта у меня только один для каждой логической группировки, а затем проекты были бы просто папками в этих "групповых хранилищах", например:

WebSites
    Project1
    Project2
DesktopApps
    Project3
Libraries
    Project4
    Project5

Возможно ли это, сохранив историю существующих репозиториев? Я немного огляделся, но все, что я могу найти, - это перемещение папок в пределах одного репозитория и перемещение папок из репозитория в новый репозиторий.

Это только для личных вещей, так что это не конец света, если это просто "нет", но было бы хорошо знать, поэтому я не просто ударяю головой о стену:)

Ответ 1

Вы можете сбрасывать его, а затем перезагружать его в подкаталог нового репозитория:

svnadmin dump http://oldrepo/ > mydump

загрузка svnadmin --parent-dir my/new/folder http://newrepo/ < mydump

Ответ 3

Вы можете использовать tailor для импорта изменений в новый репозиторий. Он проверяет код из старого репозитория на одну ревизию за другим и передает его в новый репозиторий.

Это также можно использовать для преобразования истории одного типа системы управления версиями в другую.

Файл проекта с портретом будет выглядеть следующим образом:

[DEFAULT]
root-directory = /var/tmp/tailor
verbose = true

[myproject]
source = svn:oldrepo
target = svn:newrepo
start-revision = INITIAL

[svn:oldrepo]
repository = svn://oldhost.example.com/svnroot
module = trunk
subdir = repo-in

[svn:newrepo]
repository = svn://newhost.example.com/some/path
module = trunk
subdir = repo-out

Если этот файл называется settings.cfg, он скопирует /trunk старого репозитория, изменив его на новое местоположение:

tailor --configfile=settings.cfg myproject

Целевой репозиторий должен уже существовать и, вероятно, должен иметь пустой подкаталог trunk.

Ответ 4

Поскольку принятый ответ неполный и не был исправлен, вот как вы на самом деле это делаете.

(1) Ваше исходное репо представляет собой однопроектное репо с топором верхнего уровня foo. Перейдите на старый сервер и создайте файл дампа:

[old-server]$ svnadmin dump /path/to/old-repo > foo.dump

(2) В вашем целевом репо уже есть два проекта: с dirs верхнего уровня bar и baz и находится в http://new-server/svn. Теперь создайте дополнительный foo верхний уровень:

[client]$ svn ls http://new-server/svn/
bar/
baz/
[client]$ svn mkdir -m "Adding new foo project" http://new-server/svn/foo
[client]$ svn ls http://new-server/svn/
bar/
baz/
foo/

(3) На вашем новом сервере репо находится в /path/to/new-repo (что соответствует http://new-server/svn/). Обратите внимание, что svn mkdir выше не создавал новый каталог в /path/to/new-repo; он просто изменил базу данных. Перейдите на новый сервер и

[new-server]$ svnadmin load /path/to/new-repo --parent-dir foo < foo.dump

Готово, с полной историей. Теперь вы можете проверить foo как:

[client]$ svn co http://new-server/svn/foo foo

Если вы впервые выполнили svnadmin, вы можете обнаружить ошибки разрешения файлов (txn-current-lock/etc), если, например, репо принадлежит apache, а вы 'не в группе apache. Самое простое исправление - добавить себя в группу apache.