Як перенести одну папку з одного сховища Subversion до іншого сховища?


156

У мене в папці "Документи" є сховище Subversion під назвою "проект". Я дійшов висновку, що він дійсно повинен зберігатися в окремому сховищі Subversion під назвою "project_docs".

Я хотів би перемістити папку "Документи" ( і всі її версії ) до сховища "project_docs". Чи є спосіб це зробити?

Відповіді:


183

Якщо у вас є доступ до самого сховища (не робочої копії), ви повинні мати змогу скинути поточне сховище, відфільтрувати його, щоб включити лише інформацію про папку документів, і завантажити його в інший сховище.

Буде щось подібне:

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
Гарний приклад. Зауважте, що, як зазначено в документації, до якої я пов’язана, це рішення буде перенумерувати всі зміни, щоб не було "порожнеч". Що потрібно пам’ятати, якщо ви посилаєтесь на редакції doc деінде.
Адам Беллер

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

11
Дякую за відповідь. У випадку, якщо комусь потрібно знати, якщо вам потрібно більше однієї папки, просто поставте пробіл між ними в список включення. Вих. ... включити папкуОдну папку Два
Робін Робінсон

6
Переномерація змін - це, мабуть, погана ідея, оскільки повідомлення про фіксацію та інструменти відстеження випусків можуть посилатися на них
Вім Коен

5
Це працювало для мене. Я користувач Windows (Visual SVN Server) і моя перша команда виглядала так, якщо це комусь допомагає:"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" dump c:\Repositories\MyRepository > c:\Temp\MyReository.dump
Кріс

30

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

Ви можете використовувати svndumpfilter2, якщо виникли проблеми.


4
Ось кращий посилання для svndumpfilter2: svn.tartarus.org/sgt/svn-tools/svndumpfilter2
bmaupin

У такому випадку ви можете додати потрібний шлях до списку ... бути максимально конкретним ..., а потім видалити ці записи з проекту після імпорту.
Джеймс Гаврон


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 лише іменем шляху.

Замініть "Шлях до вузла: 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.