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

мы находимся в процессе перемещения наших репозиториев SVN с одной машины на другую, и с ним придет новое доменное имя для нового РЕПО. Проблема в том, что в репозитории существует множество ссылок svn:externals на другие проекты в репозитории. Так, например, у нас есть projectA, который имеет в svn:externals свойства:

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

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

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

6 ответов


Как вы указали, что все еще хотите иметь возможность проверять старые версии, единственное решение-действительно "переписать" всю историю (решение D, упомянутое ранее).

чтобы сделать это, вы должны:

1) сбросить содержимое весь хранилище с помощью svnadmin свалку:

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

2) отредактируйте файл дампа, чтобы изменить URL-адреса svn:externals. это самая трудная часть: если репозиторий содержит также двоичные данные, открытие файла dump в текстовом редакторе скорее всего повредит файл dump. У меня был хороший опыт использования так называемого "шестнадцатеричного редактора", например бесплатный шестнадцатеричный редактор 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, которое может точно предотвратить такие проблемы в future:
http://subversion.tigris.org/svn_1.5_releasenotes.html#externals


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

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

это исправляет каждый внешний к subversion 1.5 формат, и использует относительные url.

Так svn: внешние, как:

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 ..)

это не сработало, как ожидалось, только переместив Родительский WC.

моим решением было редактировать сами репозитории (я использовал браузер РЕПО Tortoise) чтобы изменить расположение окружения. После этого изменения обновление перемещенного родителя было всем, что требовалось, чтобы привести все в соответствие.

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

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


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

например, имя файла vi-B.свалка

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

Node-path: trunk/src / include

узел-вид: реж.--1-->

Node-action: change

опора-содержание-длина: 192

контент-длина: 192

K13

svn: внешние

V 156

MGL_ABC в SVN://имя_сервера/dir1 и/Директория dir2

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

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


вы можете:

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

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

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

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


все мои внешние файлы были в каталогах с именем flow. Я исправил URL-адреса в моих внешних с помощью этого One-liner (bash shell):

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(.*)/ /')" $p/..; done