Как разделить папку SVN на собственный репозиторий, когда она была переименована? - PullRequest
41 голосов
/ 11 января 2009

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

Сначала я попробовал сделать это как обычно

svnadmin dump /path/to/repo > largerepo.dump
cat largerepo.dump | svndumpfilter include my/directory >mydir.dump

но это не работает, так как каталог был перемещен и скопирован за эти годы, а файлы были перемещены в него и из него в другие части хранилища. В результате их много:

svndumpfilter: Invalid copy source path '/some/old/path'

Далее я попытался включить эти /some/old/path по мере их появления, и после длинного, длинного списка включенных файлов и каталогов svndumpfilter завершается, НО импорт результирующего дампа не производит те же файлы, что и текущий каталог есть.

Итак, как правильно отделить каталог от этого хранилища, сохраняя историю?

РЕДАКТИРОВАТЬ: Я специально хочу, чтобы trunk/myproj был стволом в новом хранилище. ПЛЮС, чтобы в новом хранилище не было никаких других старых вещей, т.е. ни у кого не должно быть возможности обновить старую версию до разделения и получить / просмотреть файлы.

Решение svndumpfilter, которое я пробовал, достигло бы именно этого, к сожалению, его невозможно выполнить, так как путь / файлы были перемещены. Решение от ng неприемлемо, так как в основном это клон + удаление дополнений, которые хранят ВСЕ историю, а не только релевантную историю myproj.

Ответы [ 18 ]

17 голосов
/ 22 мая 2009

У меня была похожая проблема с разделением хранилища ..

svndumpfilter: Invalid copy source path /dir/old_dir

Что я сделал, чтобы обойти проблему, так это включить дополнительные старые каталоги, которые запрашивали, или что вы знаете, что переехали. В моем случае я переместил 3 каталога в другой каталог.

например. Папки A, B, C перемещены в папку D

cat project.dump | svndumpfilter include A B C D > new.dump

Это, похоже, решило мою проблему. Я смог отделить Папку D от остальной части Репо. С другой стороны, при исключении D я не получил ошибку, я бы предположил, потому что удаление D не требует ссылки / история на A, B, C

14 голосов
/ 23 июля 2009

Эта проблема возникает, когда один из каталогов / файлов, включенных в svndumpfilter, изначально был скопирован или перемещен из раздела дерева, который не был включен.

Для решения проблемы используйте этот скрипт: svndumpfilter3

6 голосов
/ 05 марта 2014

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

cd /usr/local/bin/
sudo wget --no-check-certificate https://raw.github.com/jasperlee108/svndumpfilterIN/master/svndumpfilter.py
sudo chmod +x svndumpfilter.py
# To be sure nothing will happened on the original repo :
cp -au /path/to/repo /tmp/largerepo.repo/
svnadmin dump /path/to/repo > /tmp/largerepo.dump
svndumpfilter.py /tmp/largerepo.dump --repo=/tmp/largerepo.repo --output-dump=/tmp/mydir.dump include my/directory

Вот что я попробовал, и не сработало :

3 голосов
/ 31 января 2011

ссылка Ауриарте на svndumpfilter3 404. Вот рабочая ссылка (по состоянию на 2011-01-31), для всех, кто ее ищет: http://furius.ca/pubcode/pub/conf/bin/svndumpfilter3.html

3 голосов
/ 22 марта 2011

Я только что успешно перенес проект из существующего комбинированного репо (в Google Code) в собственное репо. Сообщения здесь были очень полезны.

Это то, что, наконец, сработало для меня ...

  1. Использовал svnsync для создания локального зеркала моего репозитория Google Code, следуя указаниям здесь .
  2. svnadmin dump to foo-dumpfile
  3. cat dumpfile | ./svndumpfilter3 --untangle mymirrorrepo trunk/foo > foo-dumpfile
  4. svnadmin create foorepo
  5. svnadmin load foorepo --ignore-uuid < foo-dumpfile

Опция --untangle на шаге 3 смогла решить все проблемы с путями, которые поставили в тупик svndumpfilter и svndumpfilter2.

Первоначально на шаге 5 я застрял на ошибке:

<<< Started new transaction, based on original revision 2
svnadmin: File not found: transaction '1-1', path 'trunk/foo'

Но этот пост в блоге Чарльза Калверта объяснил, что все, что требовалось, это создать директорию сундука в foorepo перед загрузкой.

3 голосов
/ 21 января 2009

Это может потенциально помочь вам: Цитата http://svnbook.red -bean.com / ru / 1.5 / svn.reposadmin.maint.html # svn.reposadmin.maint.replication

В Subversion 1.5 svnsync расширила способность также отражать подмножество хранилища, а не все. Процесс настройки и обслуживания такого зеркала точно такой же, как и при зеркалировании всего хранилища, за исключением того, что вместо указания корневого URL-адреса исходного хранилища при запуске init svnsync вы указываете URL-адрес некоторого подкаталога в этом хранилище. Синхронизация с этим зеркалом теперь будет копировать только те биты, которые были изменены в этом подкаталоге исходного репозитория. Однако у этой поддержки есть некоторые ограничения. Во-первых, вы не можете зеркально отразить несколько непересекающихся подкаталогов исходного репозитория в одно зеркальное хранилище - вам нужно вместо этого отразить некоторый родительский каталог, общий для обоих. Во-вторых, логика фильтрации полностью основана на пути, поэтому, если подкаталог, который вы зеркалируете, был переименован в какой-то момент в прошлом, ваше зеркало будет содержать только ревизии, поскольку каталог появился по указанному вами URL-адресу. Аналогичным образом, если в будущем исходный подкаталог будет переименован, ваши процессы синхронизации прекратят зеркальное отображение данных в тот момент, когда указанный вами исходный URL больше не действителен.

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

3 голосов
/ 30 марта 2010

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

В частности, эта команда:

sudo svnadmin dump /home/setup/svn/repos/main_repl | sudo ./svndumpfilter2.py /home/setup/svn/repos/main_repl Development QA compliance > ~/main_repl_dump.trim

Я упоминал об ошибке «Недостаточно памяти», однако, поскольку я запускал svn на виртуальной машине, я просто увеличил объем памяти до 2G. Хотя я понимаю, что это может быть не вариант для всех, я заметил, что он работает намного быстрее, чем с 512M. (2G, вероятно, не было необходимости).

В настоящее время обрабатывается ревизия 18,631.

В случае, если кому-то интересно, причина, по которой мне нужно было разорвать часть репо, заключалась в том, что мы создавали теги / копии для распространения для реализации файлов по другому пути репо. По какой-то причине этот процесс привел к тому, что репо взлетело до огромных размеров. (Мы сейчас в 17G.)

Я делаю это в репозитории SVN репликации, версия 1.5.6, в Debian Lenny, 5.0.4.

2 голосов
/ 22 марта 2010

Я также ищу ответ на этот вопрос (приходится иметь дело с этим сам). На основании ответа Алекса, я нашел http://furius.ca/pubcode/pub/conf/common/bin/svndumpfilter3.html которая утверждает, что исправляет некоторые проблемы svndumpfilter2. Я считаю, что это частичное решение.

Товар:

Переписать Subversion svndumpfilter в чистом Python, что позволяет распутывать перемещение / копирование операции между исключенным и включены наборы файлов / директорий, превращая их в дополнения. если ты используйте эту опцию, он выбирает оригинальные файлы из данного хранилище.

Концерн

Важно

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

2 голосов
/ 22 марта 2010

Это дикий и сумасшедший удар в слишком темных вещах, но как насчет импорта репозитория SVN в git с помощью git-svn / [tailor] [3], отделив каталог с помощью git-split , а затем экспортируйте его обратно в SVN с помощью git-svn ?

2 голосов
/ 11 января 2009

Почему бы не скопировать весь репозиторий, поместите его в новый. Затем разветвите ствол, удалите головку и объедините нужные части обратно в ствол из ветви. Затем вы сохранили историю и разделили нужные части в новом хранилище.

  1. Дамп к / хоботу
  2. ветвь / ствол / ветки / ствол
  3. Удалить / багажник
  4. Слияние / ответвления / ствол / всё что угодно обратно в / ствол или / ствол / всё что угодно

Таким образом, вы сохранили всю историю и выборочно выбрали нужные части.

...