SVN: минимизировать дамп, необходимый для перемещения проекта в собственное репо.

Мой оригинальный вопрос был ниже. С тех пор я пробовал несколько вещей, чтобы посмотреть, смогу ли я заставить это работать.

У меня есть крошечный сценарий оболочки, который выглядит так:

svnadmin dump -r108917 ./repo \
    | svndumpfilter include /KeyManagement \
          --drop-empty-revs \
          --skip-missing-merge-sources \ 
          --renumber-revs > km.svndump \

while read rev
do
    svnadmin dump -r$rev --incremental ./repo \
        | svndumpfilter include /KeyManagement \
             --drop-empty-revs \
             --skip-missing-merge-sources \
             --renumber-revs >> km.svndump
done << km.revs.txt

km.revs.txt — это текстовый файл, который просто содержит ревизии, содержащие изменения в проекте /KeyManagment.

Когда я впервые сделал это, я думал, что фильтрую потом. Однако в самой первой сброшенной ревизии размер km.svndump вырос до более чем 68 гигабайт. Упс. Во второй попытке фильтрую проект через svndumpfilter.

Это работало довольно долго (я nohup делал это и просто проверял время от времени). Когда я закончил, я получил km.svndump, показывающий UUID, первую версию и ошибку недостаточно памяти. Судя по всему, мой скрипт не прошел первую ревизию для сброса.

Есть идеи, как продолжить?


У нас есть репозиторий с специальным проектом, который действительно несовместим с остальной частью репозитория. Весь репозиторий может просматривать любой пользователь из группы LDAP Development. Однако один проект содержит информацию, которую мы хотим, чтобы видели только люди, работающие над этим проектом. (Наш проект KeyManagement). Макет репо выглядит так:

  • /trunk - Транк для остальной части репо
  • /branches - ветки для остальной части репо
  • /tags — Теги для остальной части репозитория
  • /KeyManagement - Специальный проект KeyManagement.

Чтобы не допустить посторонних глаз, мы используем файл svn_acces, чтобы указать пользователей, которые могут это видеть. Это вызвало много проблем при обслуживании, и я просто хотел бы сделать KeyManagement отдельным репозиторием с собственной группой доступа LDAP. (У нас уже есть несколько репозиториев с собственной группой LDAP).

Проблема в том, что в нашем репозитории более 175 000 ревизий, и только 124 из этих ревизий связаны с проектом KeyManagement. Сброс всех 175 000 ревизий занимает около 30+ часов. Если бы я мог просто выгрузить нужные мне ревизии, я бы сделал весь дамп за пару часов.

Другая проблема заключается в следующем:

$ svn log -r108917:108918 -v $REPO
------------------------------------------------------------------------
r108917 | svnadmin | 2011-03-23 00:46:04 -0500 (Wed, 23 Mar 2011) | 1 line
Changed paths:
A /KeyManagement

New folder KeyManagement
------------------------------------------------------------------------
r108918 | svnadmin | 2011-03-23 00:47:18 -0500 (Wed, 23 Mar 2011) | 1 line
Changed paths:
A /KeyManagement/trunk (from /trunk/KeyManagement:108917)
D /trunk/KeyManagement

Move the KeyManagement
------------------------------------------------------------------------

Судя по всему, KeyManagement тоже когда-то был под /trunk. Мой предыдущий опыт работы с дампом и загрузкой с использованием svndumpfilter заключался в том, что мне приходилось выгружать и загружать и /KeyManagement, и /trunk/KeyMangement одновременно. Честно говоря, меня не волнует /trunk/KeyManagement, потому что приложение было полностью переделано, и никому нет дела до кода.

Я так понимаю, что первая ревизия дампа - это полная ревизия. Можно ли мне сделать что-то вроде этого:

$ svnadmin dump -r108917:108918 old_repo > dump_file
$ svnadmin dump -r108103 --incremental old_repo >> dump_file #Revision with KeyManagement
$ svnadmin dump -r107429 --incremental old_repo >> dump_file #Revision with KeyManagement
...

$ svnadmin load --parent-dir new_repo < dump_file

И просто дамп тех ревизий, которые связаны с KeyManagement. Меня не интересуют версии под /trunk. С тех пор проект был полностью переработан. Я знаю ревизии, я могу легко написать сценарий оболочки для этого. Ни одна из ревизий, связанных с KeyManagement, не связана с другими проектами.

Я просто не хочу тратить на это 40+ часов.


person David W.    schedule 27.08.2014    source источник
comment
На правах бреда: svnrdump dump URL/Of/KeyManagement пробовал?   -  person Lazy Badger    schedule 05.09.2014
comment
Я не пробовал svnrdump. На самом деле, я не смог найти его на своем Mac, где расположены svn, svnadmin, svnlook, svndumpfilter, svnversion, svnsync и svnserve. Нет, svnrdump находится под /Applications/Xcode.app/Contents/Developer/usr/bin вместе с той же версией 1.7.10 всех остальных команд Subversion. Я свяжу их все с /usr/local/bin, который находится на моем пути до /usr/bin.   -  person David W.    schedule 05.09.2014
comment
Я не использовал svnrdump раньше. Это довольно новый инструмент, и похоже, что он работает немного иначе, чем svndump. Похоже, что svnrdump выполняет фильтрацию и дамп одновременно.   -  person David W.    schedule 05.09.2014


Ответы (1)


Наконец-то я использовал svnrdump. Мне пришлось сбросить все ревизии, но это позволило мне указать, что я хотел только /KeyManagement. С svndump и svndumpfilter мне пришлось бы указать /KeyManagement и /trunk/KeyManagment, так как именно там находился исходный проект.

К сожалению, вы не можете использовать svndumpfilter для svnrdump, а так как сообщалось обо всех изменениях, я не мог перенумеровать их и опустить пустые.

Тем не менее svnrdump позволил мне захватить только один каталог, хотя я не мог изменить его местоположение или пропустить пустые ревизии и перенумеровать.

person David W.    schedule 11.09.2014
comment
После того, как вы загрузили один каталог в отдельный репозиторий, вы можете снова выгрузить его, используя svndump, чтобы отфильтровать пустые версии перед загрузкой в ​​​​конечный пункт назначения. То есть, предполагая, что первоначальная версия этого единственного каталога немного меньше. Кроме того, не забудьте изменить UUID на новом репро, так как я узнал, что это может вас укусить позже... - person AVee; 11.09.2014
comment
Неа. Не работает. Я действительно сделал это. svndumpfilter ничего не отфильтровывал, так как все транзакции были либо просто сообщениями фиксации, либо проекта /KeyMangement. Затем svnadmin load не перенумеровывал коммиты, потому что не было пустых коммитов. Было бы неплохо, если бы svnrdump и svndump использовали один и тот же формат или чтобы svndumpfilter работало с дампами репозиториев типа 3. - person David W.; 12.09.2014