Как переместить одну папку из одного хранилища Subversion в другое хранилище?


156

У меня есть папка «документы» в хранилище Subversion с именем «проект». Я пришел к выводу, что он действительно должен храниться в отдельном хранилище Subversion с именем "project_docs".

Я хотел бы переместить папку "docs" ( и все ее ревизии ) в репозиторий "project_docs". Есть ли способ сделать это?

Ответы:


183

Если у вас есть доступ к самому репозиторию (а не к рабочей копии), вы сможете выгрузить текущий репозиторий, отфильтровать его, включив в него только информацию о папке docs, и загрузить его в другой репозиторий.

Было бы что-то вроде этого:

svnadmin dump /svn/old_repos > ./repository.dump
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./repository.dump > ./docs_only.dump
svnadmin load /svn/new_repos < ./docs_only.dump

Без доступа к репозиторию вы не сможете вести историю ревизий, и вам придется согласиться на копирование файлов в новый репозиторий и фиксацию.


1
Хороший пример. Обратите внимание, что, как указано в документации, на которую я ссылаюсь, это решение перенумерует все ревизии, чтобы не было «пустых». О чем следует помнить, если вы ссылаетесь на редакцию документа где-либо еще.
Адам Беллер

1
Я предложил удалить пустые ревизии, чтобы не добавлять кучу пустых ревизий в целевой репозиторий, что, скорее всего, сбивало с толку тех, кто не знал о загрузке. Так как --preserve-revprops будет хранить сообщения фиксации вместо использования загрузки по умолчанию.
Самуил

11
Спасибо за ответ. Если кому-то нужно знать, если вам нужно больше одной папки, просто вставьте пробел между ними в списке включения. Ex. ... включить папку Одна папка два
Робин Робинсон

6
Перенумеровать ревизии, вероятно, плохая идея, поскольку на них могут ссылаться сообщения о коммитах и ​​инструменты отслеживания ошибок
Вим Коенен,

5
Это сработало для меня. Я пользователь Windows (Visual SVN Server), и моя первая команда выглядела так, если она кому-нибудь поможет:"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" dump c:\Repositories\MyRepository > c:\Temp\MyReository.dump
Chris

30

У svndumpfilter есть серьезный недостаток - если файл или путь были скопированы с пути, который вы фильтруете, на путь, по которому вы фильтруете, svndumpfilter не сможет заполнить историю, и задание не будет выполнено.

Вы можете использовать svndumpfilter2, если у вас возникла эта проблема.


4
Вот лучшая ссылка для svndumpfilter2: svn.tartarus.org/sgt/svn-tools/svndumpfilter2
bmaupin

В этом случае вы можете добавить требуемый путь в список ... быть как можно более конкретным ... и затем удалить эти записи из проекта после импорта.
Джеймс Гаврон

6

Это обсуждается в документации SVN. Ознакомьтесь с разделом « Обслуживание репозитория » на svndumpfilter... В нем конкретно описывается, как выгружать проекты из центрального репозитория и перемещать их в новые отдельные репозитории.


2

Я не верю, что вы можете сделать это удаленно (т.е. без локальной копии). Но это должно сработать: svn exportпапка с исходного сервера, затем папка с svn addновым репо.

Подобно:

$ svn checkout svn://example.net/newrepo .
$ svn export svn://example.com/oldrepo/mydir ./mydir
$ svn add ./mydir; svn commit

Редактировать: D'Oh, это отбрасывает историю. Используйте, svnadminкак описывает Самуил .


3
Однако вы не можете сохранить ревизии без доступа к самому хранилищу. Если у вас есть только рабочая копия, это лучшее, что он может сделать.
Самуил

2

Для дальнейшего использования:

Документация SVN четко сообщает:

Если вы планируете вручную редактировать файл дампа, чтобы удалить каталог верхнего уровня, убедитесь, что ваш редактор не настроен на автоматическое преобразование символов конца строки в собственный формат (например, \ r \ n в \ n), в связи с этим содержание не будет согласовываться с метаданными. Это сделает файл дампа бесполезным.

Используйте sed или Vim для замены каталога верхнего уровня, но это имя каталога также содержалось в файле проекта !!!! Это вызывает ошибку контрольной суммы загрузки SVN.

Поэтому, когда вы выполняете эту операцию, не делайте подстановок строк с помощью sed только с именем пути.

Замените «Node-path: old_path» на «Node-path: new_path». См. Главу 5 книги SVN «Администрирование хранилища» для более подробной информации.


1

Я пытался использовать принятый ответ, но у меня был огромный репозиторий, и я хотел экспортировать небольшой каталог, и я не мог позволить себе сбросить весь репозиторий.

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

svn log URL_to_docs | awk '/^r/{gsub(/^r/,"",$1);print $1}' > revisions.txt
#tac for revisions in reverse (oldest revision first)
tac revisions.txt | while read line; do svnadmin dump /svn/old_repo -r$line >> ./docs_revisions.dump ; done

#You don't have to filter if you commited only files in your directory docs in your exported revisions
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./docs_revisions.dump > ./docs_only.dump

svnadmin load /svn/new_repos < ./docs_only.dump

Вы должны заменить свой URL репо ( URL_to_docs), расположение в сервере ( /svn/old_repo) и путь к документации в репозитории ( path/to/docs)

Вы можете легко отредактировать свой, docs_only.dumpесли вы хотите изменить местоположение вашего каталога документов в вашем новом хранилище.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.