Как перенести все 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-адреса, чтобы мы все еще могли проверить старые версии этих проектов без неработающих ссылок.

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

Какой конкретный урок вы имеете в виду с помощью "svn: // localhost /" -thing?

conny 15.10.2008 17:25

Я имел в виду, что по возможности следует использовать общее имя хоста вместо определенного имени домена, потому что при изменении имени домена я получаю такой беспорядок. знак равно

Nik Reiman 15.10.2008 17:37

Я не вижу необходимости использовать префикс svn: // localhost. Вы знаете, что можно использовать относительные URL-адреса? См. subversion.tigris.org/svn_1.5_releasenotes.html#externals

Andrea Francia 22.11.2009 23:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
3
8 852
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ты мог бы:

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' приходит на помощь!

jeroenh 04.11.2009 10:02

Вы никогда не должны редактировать дамп SVN с помощью текстового редактора, если вы не хотите иметь дело с хешами MD5 и SHA1 для файла и данных опоры. Ручной пересчет этих хэшей делает ручное редактирование файлов дампа SVN, содержащих что-либо больше, чем несколько десятков оборотов, сложной задачей. Намного лучше использовать один из инструментов, созданных для работы, например svndumptool.

Ausmith1 13.02.2014 21:46

Я бы использовал для этого 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-адресов корневого сервера.

Я не понимаю вторую часть (после регулярного выражения). Не могли бы вы поподробнее? Спасибо .

moujib 10.11.2011 19:46

Я добавил соответствующую ссылку и добавил дополнительные пояснения к ответу. Надеюсь это поможет.

ldav1s 10.11.2011 23:17

Смотрите также этот пост: stackoverflow.com/questions/21292688/regex-for-svndumptool?l‌ q = 1

Ausmith1 13.02.2014 21:47

Для всех новичков в Linux: распакуйте svndumptool с помощью tar --no-same-owner -xvzf svndumptool-0.6.1.tar.gz, cd в новый каталог, установите его с помощью ./setup.py install, а затем не забудьте добавить .py в командную строку в ответе ...

JCH2k 13.07.2015 11:13

Мне пришлось переместить 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

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