Svn 1.7 - Как переключить рабочую копию на перемещенное хранилище, если рабочая копия имеет несуществующую редакцию - PullRequest
0 голосов
/ 02 февраля 2012

Был проект svn в репозитории svn http://svn/repoA/path1/.Назовите это оригинальное репо .

Это было скопировано в http://svn/repoA/path2.Назовите это new repo .

Локальная рабочая копия на одном из наших компьютеров, извлеченная из исходного репо, была обновлена ​​после того, как эта копия произошла.

Тогда исходное репо былоудалено.

Теперь мы хотим реинтегрировать рабочую копию в новый репозиторий.

svn switch подходит для этого.Запуск внутри базовой директории проекта:

svn switch http://svn/repoA/path2

Однако switch жалуется, потому что у проекта есть номер редакции, которого нет в новом репо.

В SVN 1.6 я бы изменилномер ревизии в .svn/entries рекурсивно под базовым каталогом проекта, где он хранится в виде открытого текста.

В SVN 1.7 такая информация, похоже, хранится непрозрачно (каким-то образом закодировано) в .svn/wc.db или другой новойфайлы.

Мой вопрос: как заставить рабочую копию думать, что она является существующей ревизией в скопированной истории ревизий, чтобы я мог переключить ее в клонированную папку репозитория и затем обновить ее?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2012

Переключатель SVN обычно удаляет файлы, которые не существуют в новом репо, и добавляет файлы, которые существуют в новом репо.Тем не менее, в вашем случае нет эквивалентной версии для переключения.Таким образом, svn switch действительно не подходит для этой работы.

Изучите svn import, чтобы восстановить старое "оригинальное" серверное репо из извлеченного рабочего репо.

Если вы ДЕЙСТВИТЕЛЬНО хотите сделать это так, как раньше, имейте в виду, что теперь SVN использует меньше каталогов .svn.Посмотрите в корне вашей проверки один каталог .svn, который имеет значение.Также имейте в виду, что большая часть информации больше не структурирована с помощью текстовых файлов, а вместо этого находится в двоичных базах данных SQLLite.Возможно изменение записей базы данных с помощью совместимого с SQLLite клиента базы данных;однако, это очень не рекомендуется.Вы подвергаетесь гораздо большему риску превратить ваш рабочий репозиторий в кучу goo, чем вы сделали со старыми текстовыми файлами.

Если целью было удаление большого количества истории изменений, но вы хотите, чтобы номер возврата былсопоставить, вам нужно перестроить repo1 так, чтобы в нем отсутствовала нежелательная история, но совпадают номера ревизий.Чтобы сделать это,

svnadmin dump /path/to/repo2 -r<start>:<end> > svn.dump
svnadmin create /path/to/repo1
svnadmin load /path/to/repo1 < svn.dump

Или в моем поддельном примере, rev 8323 - это последний бит истории, который нужно сохранить, а текущий rev - 9929.

svnadmin dump /path/to/repo2 -r8323:9929 > svn.dump
svnadmin create /path/to/repo1
svnadmin load /path/to/repo1 < svn.dump
0 голосов
/ 02 февраля 2012

Вы знаете, что вы не должны были касаться этих .svn каталогов.Бьюсь об заклад, вы также открываете заднюю часть электронных приборов, хотя на этикетке четко написано Предупреждение. Внутри нет деталей, обслуживаемых пользователем.Не открывайте, если не требуется внезапная смерть от удара током .

Да, я тоже.

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

Или вы можете извлечь новую рабочую копию в другом каталоге, удалить все старые каталоги .svn из старой рабочей копии изатем просто скопируйте все эти файлы в новый рабочий каталог.Затем вы можете сделать svn status, чтобы найти то, что изменилось, и исправить эти проблемы.

...