Как перенести все URL-адреса в свойствах svn:externals через репозиторий?

StackOverflow https://stackoverflow.com/questions/204616

Вопрос

Мы находимся в процессе переноса наших репозиториев SVN с одного компьютера на другой, и вместе с этим появится новое доменное имя для нового репозитория.Проблема в том, что в репозитории содержится множество ссылок svn:externals на другие проекты внутри репозитория.Например, у нас есть проект A, который имеет свойства svn:externals:

external/libraryA svn://oldserver.net/repo/libraryA
external/libraryB svn://oldserver.net/repo/libraryB

...и так далее.Все URL-адреса ссылаются на это конкретное доменное имя, поэтому его можно легко проанализировать.Уже усвоив урок, я перенесу эти URL-адреса на «svn://localhost/», но мне нужно найти способ просмотреть историю репозитория и перезаписать все старые URL-адреса, чтобы мы все равно могли их проверить. старые версии этих проектов без неработающих ссылок.

Как бы я это сделал?

Это было полезно?

Решение

Поскольку вы указали, что все еще хотите иметь возможность проверять более старые версии, единственное решение - это «переписать» всю историю (решение D, упомянутое ранее).

Для этого вам следует:

1) Сбросить содержимое весь репозиторий с использованием дамп свнадмина:

$ svnadmin dump /path/to/repos > original-dumpfile
* Dumped revision 0.
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.

2) Отредактируйте файл дампа, чтобы изменить URL-адреса svn:externals. Это самая сложная часть:Предполагая, что репозиторий также содержит двоичные данные, открытие файла дампа в текстовом редакторе, скорее всего, приведет к его повреждению.У меня был хороший опыт использования так называемого «шестнадцатеричного редактора», например Бесплатный шестнадцатеричный редактор XVI32

3) Создайте новый репозиторий и загрузите в него измененный файл дампа:

$ svnadmin create newrepos
$ svnadmin load newrepos < modified-dumpfile

Для получения дополнительной информации вас также может заинтересовать эта ссылка:
http://svnbook.red-bean.com/en/1.1/ch05s03.html

ПРИМЕЧАНИЕ:В Subversion 1.5 фактически добавлена ​​поддержка относительные URL-адреса в свойстве svn:externals, которое может точно предотвратить подобные проблемы в будущем:
http://subversion.tigris.org/svn_1.5_releasenotes.html#externals

Другие советы

я бы использовал SvnDumpTool для этого.Здесь есть именно то, что вы ищете:

svndumptool transform-prop svn:externals "(\S*) (|-r ?\d* ?)http://oldserver.net(/\S*)" "\2\3 \1" source.dumpfile source-fixed-externals.dumpfile

Это фиксирует каждое внешнее по отношению к формат субверсии 1.5, и использует относительные URL-адреса.

Итак, svn:externals вроде:

external/libraryA svn://oldserver.net/repo/libraryA

становиться:

 /repo/libraryA external/libraryA

используя относительные URL-адреса корня сервера.

Мне пришлось переместить 12 рабочих копий между 9 пользователями и 4 развертываниями.Это было простое изменение, замена домена на IP, т.е. thing.domain.net -> 192.168.0.1

Ожидая svn relocate чтобы вести себя так, как описано (обходить вложенные внешние элементы), я написал простую инструкцию DOS для запуска в каждом месте:

for /D %G in (*) do ( cd ./%G & svn relocate http://thing.domain.net http://192.168.0.1 & cd ..)

Это не сработало должным образом, только перемещение родительского туалета.

Мое решение состояло в том, чтобы отредактировать сами репозитории (я использовал Tortoise Repo Browser), чтобы изменить расположение внешних объектов.После этого изменения обновление перемещенного родителя — это все, что требовалось, чтобы привести все в порядок.

Вероятно, было бы неплохо заставить всех пользователей Tortoise очистить историю своих URL-адресов, чтобы они случайно не выполняли операции с использованием старого URL-адреса (он все еще существует в поиске DNS):

Settings->Saved Data->URL history->Clear

Я отредактировал файл дампа с помощью vi, но мне пришлось использовать ключ «-b» для редактирования в двоичном режиме, чтобы любые символы, которые можно было интерпретировать как окончания строк, не конвертировались.

напримерvi -b имя_файла.дамп

Кроме того, я обнаружил, что при изменении длины вашего URL-адреса существуют длины строк, которые также необходимо изменить.Например, рассмотрим запись, которая выглядит следующим образом:

Путь узла:транк/источник/включить

Тип узла:реж.

Узел-действие:изменять

Длина реквизита-контента:192

Длина контента:192

К13

СВН: внешние устройства

В 156

MGL_ABC svn://имя_сервера/dir1/dir2

MGL_DEF svn://имя_сервера/dir1/dir3

Если при изменении этих URL-адресов изменится длина строки, вам также необходимо изменить «192», «192» и «156», чтобы они соответствовали новой длине.Мне было трудно вычислить абсолютную длину, но легко найти дифференциал.
Например, предположим, что URL-адрес 1 станет короче на 3 символа, а URL-адрес 2 станет короче на 4 символа.Затем вам придется вычесть «7» из каждого из этих трех чисел длины строки.

Вы могли бы:

а) проверьте старую версию и измените файл хостов, указав старое имя на новый адрес, затем обновите svn.Если URL-путь также изменился...ну тогда ты тоже можешь:

б) потратьте время на написание скрипта, который находит свойства в текущей (старой ревизии) рабочей копии и изменяет там URL-адреса, не фиксируя их.ИЛИ:

в) запишите ревизию(-и), в которой вы зарегистрировали новые значения свойств, извлеките старую версию и просто объедините эти ревизии (-которые влияют только на свойства) в вашу рабочую копию.

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

Все мои внешние устройства находились в каталогах с именем flow.Я исправил URL-адреса во внешних объектах с помощью этой однострочной строки (оболочка bash):

for p in $(find -maxdepth 4 -name flow); do svn ps svn:externals "$(svn pg svn:externals $p/.. | perl -pe 's/^(\w+) svn\+ssh.*thing\.domain\.net(.*)/$2 $1/')" $p/..; done
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top