Как переместить одну папку из одного хранилища Subversion в другое хранилище?
У меня есть папка "документы" в хранилище Subversion с именем "проект". Я пришел к выводу, что он действительно должен храниться в отдельном хранилище Subversion с именем "project_docs".
Я хотел бы переместить папку "docs" (и все ее ревизии) в репозиторий "project_docs". Есть ли способ сделать это?
6 ответов
Если у вас есть доступ к самому репозиторию (а не к рабочей копии), вы сможете выгрузить текущий репозиторий, отфильтровать его, включив в него только информацию о папке 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
Без доступа к репозиторию вы не сможете вести историю ревизий, и вам придется согласиться на копирование файлов в новый репозиторий и фиксацию.
У svndumpfilter есть серьезный недостаток - если файл или путь были скопированы с пути, который вы фильтруете, на путь, по которому вы фильтруете, svndumpfilter не сможет заполнить историю, и задание не будет выполнено.
Вы можете использовать svndumpfilter2, если у вас возникла эта проблема.
Это обсуждается в документации SVN. Проверьте раздел обслуживания репозитория на svndumpfilter
... В нем конкретно описывается, как выгружать проекты из центрального репозитория и перемещать их в новые отдельные репозитории.
Я не верю, что вы можете сделать это удаленно (т.е. без локальной копии). Но это должно работать: 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
как описывает Самуил.
Я пытался использовать принятый ответ, но у меня был огромный репозиторий, и я хотел экспортировать небольшой каталог, и я не мог позволить себе сбросить весь репозиторий.
Поэтому я экспортировал только те ревизии, в которых изменился мой каталог (это может не сработать, если каталог, который вы хотите экспортировать, содержит ссылки на другие места в вашем репо).
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
если вы хотите изменить местоположение вашего каталога документов в вашем новом хранилище.
Для дальнейшего использования:
Документация SVN четко сообщает:
Если вы планируете вручную редактировать файл дампа для удаления каталога верхнего уровня, убедитесь, что ваш редактор не настроен на автоматическое преобразование символов конца строки в собственный формат (например, \r\n в \n), в связи с этим содержание не будет согласовываться с метаданными. Это сделает файл дампа бесполезным.
Используйте sed или Vim для замены каталога верхнего уровня, но это имя каталога также содержалось в файле проекта!!!! Это вызывает ошибку контрольной суммы загрузки SVN.
Поэтому, когда вы выполняете эту операцию, не делайте строковых подстановок с помощью sed только с именем пути.
Замените "Node-path: old_path" на "Node-path: new_path". См. Главу 5 книги SVN "Администрирование хранилища" для более подробной информации.
Мне не удалось достичь такой же цели ни с одним из
svndumpfilter
инструменты.
Затем я нашел svndumpsanitize. Вместо простого анализа ревизий в файле дампа, он действительно пытается подключить все ревизии, в которых упоминаются включенные файлы, или разумно и безопасно пропустить ревизии с исключенными файлами. Это может быть или не быть тем инструментом, который вам нужен (или нужен), но попробовать стоит.