Сбой при переназначении репозитория subversion

#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». Появления.