Как перенести все URL-адреса в свойствах svn:externals через репозиторий?
-
03-07-2019 - |
Вопрос
Мы находимся в процессе переноса наших репозиториев 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