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