#svn #sed #svnadmin #svn-repository
#svn #sed #svnadmin #svn-репозиторий
Вопрос:
Я хочу изменить порядок в репозитории subversion; для этого я использую svnadmin dump, svnadmin load, svndumpfilter и sed.
Например, я хочу «переместить» следующий каталог (на самом деле, это намного больше, но сейчас я делаю это шаг за шагом):
project1/common/bib -> trunk/pub/common/bib
Для этого я выполняю следующую команду для экспортированного файла дампа:
sed -i "s|Node-path: project1/common/bib|Node-path: trunk/pub/common/bib|g" repo.dump
sed -i "s|Node-copyfrom-path: project1/common/bib|Node-copyfrom-path: trunk/pub/common/bib|g" repo.dump
Однако, когда я загружаю это в новый / пустой репозиторий, я получаю:
<<< Neue Transaktion basierend auf Originalrevision 64 gestartet
svnadmin: Datei nicht gefunden: Transaktion »63-1r«, Pfad »trunk/pub/common/bib«
* Füge Pfad hinzu: trunk/pub/common/bib ...
Я не понимаю, почему это не работает, поскольку я тупо заменяю каждую запись!
Комментарии:
1. Вы говорите, что используете
svndumpfilter
, но не указываете команды, которые выполняете.2. Это не имеет значения (это просто для включения / исключения). Просто предположим, что у меня вообще нет svndumpfilter (что верно для моих экспериментов). Я хочу переместить project1 / common / bib в trunk / pub / common / bib в репозитории (т. Е. в его файл дампа)
3. у svn есть собственная команда (
svn mv URL1 URL2
) для перемещения каталога в репозитории в другое место в том же репозитории. Почему бы не использовать это вместо dump / sed / load?4. Поскольку перемещение видно в истории, история немного нарушена и т.д. dump / sed / load, насколько я понимаю, позволил бы просто переместить их, поскольку они всегда были бы там. Поскольку это касается большой структуры моих репозиториев, это то, чего я хотел бы хотеть
Ответ №1:
дамп svnadmin действительно создаст полную историю вашего репозитория «project1».
Однако, хотя это и возможно, изменение путей к файлам в этой истории может быть сложным. Ваши команды sed хороши, но они могут выполнить работу только на 98%. Чтобы корректно изменить историю, вам необходимо выполнить дополнительный поиск и проверку измененного файла истории.
Вот пример того, как все может быть повреждено, если вы выполняете только эти 2 команды sed:
Предположим, что общий каталог был добавлен и зафиксирован в редакции 5, svndump выдал бы:
Node-path: project1/common
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10
PROPS-END
Вы запускаете свою незавершенную магию sed, и новому репозиторию не удается создать каталог trunk / pub / common:
Node-path: project1/common # bad! should be: trunk/pub/common !!!
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10
PROPS-END
С этого момента svn будет пытаться повторно создать ваши недопустимые пути, тем самым предоставляя:
<<< Started new transaction, based on original revision 2
svnadmin: File not found: transaction '1-1', path '/trunk/pub/common'
* adding path : trunk/pub/common ...
Иногда это может сработать. Но в большинстве случаев это приводит к сбою.
Решение:
Лично я бы использовал текстовый редактор с удобными функциями поиска и замены (например, vim) и заменил бы все «project1», «project1 / common» и «project1 / common / bib». Появления.