Назад | Перейти на главную страницу

Сохранение части репозитория Subversion, но есть изменение пути посередине

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

Я считаю, что прочитал и понял руководство.

Что пробовал:

svnadmin dump /home/Subversion-Repository | \
   svndumpfilter include new-name /new-name /foo/bar/old-name > something.svn

svnadmin create /new/repos
# Create directories foo/bar and new-name
svnadmin load /new/repos < something.svn

Но не получается:

<<< Started new transaction, based on original revision 5944
svnadmin: File not found: transaction '5944-4l4', path 'new-name/myfile'
     * editing path : new-name/myfile ...

Что меня удивляет, так это то, что в полном дампе (без использования svndumpfilter) есть ревизия, которая добавляет файлы в новое место:

Node-path: new-name
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10

но svndumpfilter не сохраняет его. Итак, первая ревизия, в которой файл под новым именем упоминается, - это «Node-action: change», а не «Node-action: add», и она терпит неудачу. Зачем?

Сценарий оболочки Unix для воспроизведения проблемы по желанию: доступный.

[Я задал вопрос в списке рассылки Subversion, но сообщение не было распространено, вероятно, поглощено чрезмерно усердным фильтром спама.]

ОБНОВЛЕНИЕ: я проверил предложение Insyte. Оба svndumpfilter2 и svndumpfilter3 терпят неудачу. Оба даже не проверяют аргумент, вы можете дать им несуществующий репозиторий, они не будут жаловаться.

Используя svndumpfilter2, изменив мой сценарий использовать ${SVNDUMPFILTER2} ${REPOS} other/new-name/bar foo/old-name/bar > ${DUMP}:

<<< Started new transaction, based on original revision 7
svnadmin: File not found: transaction '8-8', path 'other/new-name/bar/myfile'
     * editing path : other/new-name/bar/myfile ...

С svndumpfilter3, изменяя мой сценарий использовать ${SVNDUMPFILTER3} --untangle=${REPOS} other/new-name/bar foo/old-name/bar > ${DUMP}:

<<< Started new transaction, based on original revision 7
svnadmin: File not found: transaction '8-8', path '/other/new-name/bar/myfile'
     * editing path : other/new-name/bar/myfile ...

Я считаю, что вы сталкиваетесь с вариантом svndumpfilter: Invalid copy source path проблема. Эта проблема возникает, когда один из каталогов / файлов, включенных svndumpfilter, изначально был скопирован (или, в вашем случае, перемещен) из раздела дерева, который не включены. Первоначальным решением этой проблемы было решение Саймона Татхама. svndumpfilter2 но его сервер svn в данный момент не работает.

Немного измененная версия доступна здесь: http://www.dehora.net/hg/tools/raw-file/tip/svn/svndumpfilter2

Другой вариант здесь: http://furius.ca/pubcode/pub/conf/bin/svndumpfilter3.html

И еще здесь: http://www.undersea.com/~nmb/svndumpfilter4

с объяснением svndumpfilter4 здесь (с archive.org - к сожалению, оригинал больше не доступен): http://replay.waybackmachine.org/20080827213200/http://www.undersea.com/~nburrell/blog/node/81

Варианты достаточно умны, чтобы использовать svnlook для получения необходимого исходного материала, даже если он находится за пределами включенного раздела дерева.

Хорошо, теперь у меня есть решение, которое работает, протестировано в реальном репозитории. Идея состоит в том, чтобы сбрасывать только ревизии до переименования (и не включая), а затем ревизии после него (с --incremental вариант). Затем я перезагружаю первый дамп, делаю переименование в новом репозитории и перезагружаю второй дамп. Вроде нормально работает.

я сделал модифицированная версия моего скрипта которые показывают подробные шаги.

Если я правильно понимаю, первоначальная проблема заключалась в том, что переименование произошло на более высоком уровне в дереве, чем каталоги, которые я хотел сохранить, и поэтому не было сохранено svndumpfilter. Следовательно, операции с файлами после переименования завершились неудачно, поскольку узлы в дампе были типа change и не было узла типа add для нового места.

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