Мы находимся в процессе перемещения наших репозиториев 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-адреса, чтобы мы все еще могли проверить старые версии этих проектов без неработающих ссылок.
Как бы я это сделал?
Я имел в виду, что по возможности следует использовать общее имя хоста вместо определенного имени домена, потому что при изменении имени домена я получаю такой беспорядок. знак равно
Я не вижу необходимости использовать префикс svn: // localhost. Вы знаете, что можно использовать относительные URL-адреса? См. subversion.tigris.org/svn_1.5_releasenotes.html#externals
Ты мог бы:
a) проверьте старую ревизию и измените свой hosts-файл, чтобы он указывал старое имя на новый адрес, затем обновите svn. В случае, если URL-путь также изменился ... ну, тогда вы также можете:
б) найдите время, чтобы написать сценарий, который находит свойства в текущей (старой редакции) рабочей копии и изменяет там URL-адреса, не фиксируя их. ИЛИ ЖЕ:
c) запишите ревизию (-ы), в которой вы отметили новые значения свойств, проверьте старую версию и просто выполните слияние этих ревизий (- которые влияют только на свойства) в вашу рабочую копию.
г) или, возможно, используйте svndump для дампа данных репозитория, замените строку URL в дампе, а затем восстановите его .. Я бы не дал вам никаких гарантий, что это даже работает ;-)
Поскольку вы указали, что все еще хотите иметь возможность проверять более старые версии, единственное решение - действительно «переписать» всю историю (решение 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. Это самая сложная часть: Предполагая, что репозиторий также содержит двоичные данные, открытие файла дампа в текстовом редакторе, скорее всего, приведет к повреждению файла дампа. У меня был хороший опыт использования так называемого "шестнадцатеричного редактора", например Бесплатная программа Hex Editor 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
Это решение, но вы действительно не хотите открывать файл дампа svn среднего размера в редакторе ... 'sed' приходит на помощь!
Вы никогда не должны редактировать дамп SVN с помощью текстового редактора, если вы не хотите иметь дело с хешами MD5 и SHA1 для файла и данных опоры. Ручной пересчет этих хэшей делает ручное редактирование файлов дампа SVN, содержащих что-либо больше, чем несколько десятков оборотов, сложной задачей. Намного лучше использовать один из инструментов, созданных для работы, например svndumptool.
Я бы использовал для этого 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-адресов корневого сервера.
Я не понимаю вторую часть (после регулярного выражения). Не могли бы вы поподробнее? Спасибо .
Я добавил соответствующую ссылку и добавил дополнительные пояснения к ответу. Надеюсь это поможет.
Смотрите также этот пост: stackoverflow.com/questions/21292688/regex-for-svndumptool?l q = 1
Для всех новичков в Linux: распакуйте svndumptool с помощью tar --no-same-owner -xvzf svndumptool-0.6.1.tar.gz
, cd в новый каталог, установите его с помощью ./setup.py install
, а затем не забудьте добавить .py
в командную строку в ответе ...
Мне пришлось переместить 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), чтобы изменить расположение внешних файлов. После этого изменения все, что требовалось, чтобы привести все в соответствие, было обновлением перемещенного родителя.
Вероятно, было бы неплохо заставить всех пользователей Tortoise очистить свою историю URL-адресов, чтобы они случайно не выполняли операции с использованием старого URL-адреса (он все еще существует в поиске DNS):
Settings->Saved Data->URL history->Clear
Я отредактировал свой файл дампа с помощью vi, но мне пришлось использовать переключатель «-b» для редактирования в двоичном режиме, чтобы любые символы, которые можно было интерпретировать как окончание строки, не преобразовывались.
например vi -b имя_файла.dump
Кроме того, я обнаружил, что при изменении длины вашего URL-адреса необходимо изменить длину строк. Например, рассмотрим запись, которая выглядит так:
Путь к узлу: trunk / src / include
Тип узла: dir
Узел-действие: изменить
Длина проп-содержимого: 192
Длина содержимого: 192
K13
svn: externals
V 156
MGL_ABC svn: // имя_сервера / каталог1 / каталог2
MGL_DEF svn: // имя_сервера / каталог1 / каталог3
Если при изменении этих URL-адресов изменяется длина строки, вам также необходимо изменить «192», «192» и «156», чтобы они соответствовали новой длине. Мне было трудно вычислить абсолютную длину, но легко найти дифференциал. Например, предположим, что URL-адрес 1 становится короче на 3 символа, а URL-адрес 2 - на 4 символа. Затем вам нужно будет вычесть «7» из каждого из этих трех чисел длины строки.
Все мои внешние файлы были в каталогах с именем 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
Какой конкретный урок вы имеете в виду с помощью "svn: // localhost /" -thing?