Как перенести одну папку из одного репозитория Subversion в другой репозиторий?

У меня есть папка "docs" в репозитории Subversion с именем "project". Я пришел к выводу, что это действительно должно храниться в отдельном репозитории Subversion с именем "project_docs". ​​

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

Ответ 1

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

Будет что-то вроде этого:

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Для справок в будущем:

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

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

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

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

Заменить "Node -path: old_path" на "Node -path: new_path". Подробнее см. В главе 5 "Администрирование хранилища" главы SVN.

Ответ 5

Я не верю, что вы можете сделать это удаленно (т.е. без локальной копии). Но это должно сработать: 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 как Самуил описывает.

Ответ 6

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

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

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, если хотите изменить местоположение вашей директории doc в новом репозитории.