Как изменить рабочую копию UUID Subversion?

13

Я недавно обновил репозитории Subversion со старой версии 1.2.3 до 1.6.0 через svnadmin dump / load . Все старые репозитории использовали один и тот же UUID (репозитории были созданы с использованием копирования репозитория шаблонов). Я изменил UUID на нескольких новых репозиториях с помощью svnadmin setuuid, чтобы он стал уникальным. Я не могу просто переместить мои существующие рабочие копии этих репозиториев, потому что UUID разные. Я знаю об экспорте рабочей копии и извлечении из нового репозитория, но мне было интересно, есть ли способ просто изменить UUID рабочей копии на месте, как то, что svnadmin setuuid делает для репозиториев.

Ioan
источник

Ответы:

3

Вам нужно отредактировать все «записи» файлов в вашем репо. Если в репозитории много каталогов, скрипт find + sed быстро справится с задачей.

Джон
источник
17

Новый ответ начиная с Subversion 1.7 в формате рабочей копии. Вам нужна sqlite3утилита командной строки.

В корневом каталоге вашей рабочей копии теперь есть одна .svn/папка с базой данных SQLite. Вы можете запросить текущий репозиторий, UUIDизвестный вашей рабочей копией:

$ sqlite3 .svn/wc.db 'select uuid from REPOSITORY where id=1'
b6dc3e6c-5320-4549-b231-c153d86d7525

В результате изменение UUIDможет быть сделано с:

$ sqlite3 .svn/wc.db 'update REPOSITORY set uuid="1c0d1ec1-2326-0410-bef5-eb29cddfc032" where id=1'

Конечно, сохраните резервную копию .svn/wc.dbфайла, прежде чем вызывать запрос на обновление. Почти нет шансов, что у вашего объекта хранилища другой идентификатор или в этой таблице несколько строк, но вы можете проверить, если вы получите неожиданные результаты.

Ив Мартин
источник
+1 отлично работал с перемещенным репо, которое также изменило UUID
Amro
8

Вот команда, которая делает трюк для SVN 1.6 и ниже:

find . -type f -name entries -exec sed -i 's/old-uuid/new-uuid/g' {} \;

Заменить old-uuidи new-uuidна фактические идентификаторы.

Эмиль М
источник
1
+1 Спасибо за решение. Это не работает для каталогов с пробелами. "find. -type f -name records -exec sed -i 's / old-uuid / new-uuid / g' {} \;" без двойных кавычек, кажется, работает.
Томми
извините за эту тему, этот метод просто сэкономил мне кучу времени .. для других, попробовавших это, просто хочу добавить заметку. Sed на MACOX, кажется, нуждается в несколько ином использовании, нужно сказать, sed -i "" 's/old-uuid/new-uuid/' и это работает (только лишние пустые двойные кавычки) ( ссылка )
Karthik T
2

Ответ Ива Мартина отлично сработал для нас на ряде рабочих копий с SVN 1.8, но в итоге мы столкнулись со случаями, когда это не сработало.

Выполнение команды Ива без «где id = 1» работало во всех случаях для нас:

$ sqlite3 .svn/wc.db 'update REPOSITORY set uuid="1c0d1ec1-2326-0410-bef5-eb29cddfc032"'

Исследуя причину этого, я обнаружил, что при перемещении хранилища сохраняются несколько UUID, вопреки интуиции Ива о том, что этого никогда не должно происходить.

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

С помощью этой команды можно проверить список сохраненных корней и UUID в рабочей копии:

$ sqlite3 .svn/wc.db 'select id,uuid,root from REPOSITORY'

Наконец, я отмечу, что мне пришлось использовать другой набор цитат для командной строки / командных файлов Windows, как показано ниже:

> sqlite3.exe .svn\wc.db "update REPOSITORY set uuid='1c0d1ec1-2326-0410-bef5-eb29cddfc032'"
Жюльен Барнойн
источник
Спасибо за подробности, когда рабочая копия была перемещена, я не знал об этом поведении
Ив Мартин
1

В разделе « Управление UUID репозитория » в svn red-bean book может быть ответ, который вы ищете.

yasouser
источник
В этом разделе говорится о UUID репозитория, а не UUID копии рабочей копии.
Ioan
@Ioan: Цитата из этого раздела: Для людей, использующих версии Subversion более ранних, чем 1.5, эти задачи немного сложнее. Вы можете явно установить UUID хранилища, отправив заглушку файла дампа хранилища, которая содержит новую спецификацию UUID, через svnadmin load --force-uuid REPOS-PATH - Разве это не то, что вам нужно?
yasouser
1
Опять же, нет, я говорю не о UUID хранилища , а о рабочих UUID копии ; рабочие копии такие же, как оформить заказ.
Ioan
Вы не можете изменить UUID рабочей копии на копию серверного репо, не обновив или не переключив рабочую копию в [новое / существующее] местоположение репо.
yasouser