Как перенести все URL-адреса в свойствах svn: externals в хранилище? - PullRequest
13 голосов
/ 15 октября 2008

Мы находимся в процессе перемещения наших 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 ]

19 голосов
/ 20 августа 2010

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

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

Исправляет все внешние данные в формате subversion 1.5 и использует относительные URL.

Так что svn: externals вроде:

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

стать:

 /repo/libraryA external/libraryA

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

7 голосов
/ 24 октября 2008

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

Для этого вам необходимо:

1) Создать дамп содержимого всего хранилища, используя svnadmin dump :

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

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

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

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

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

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

1 голос
/ 09 апреля 2016

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

например. vi -b filename.dump

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

Node-path: trunk / src / include

Тип узла: dir

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

длина-проп-содержимого: 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 символа. Затем вам нужно будет вычесть «7» из каждого из этих трех чисел длины строки.

1 голос
/ 11 марта 2016

Мне пришлось переместить 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 Repo Browser), чтобы изменить расположение внешних элементов. После этого изменения обновление перемещенного родителя - это все, что требовалось, чтобы привести все в соответствие.

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

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

0 голосов
/ 10 мая 2017

Все мои внешние файлы были в каталогах с именем 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
0 голосов
/ 15 октября 2008

Вы могли бы:

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

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

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

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

...