Откат или возврат всего репозитория svn к более старой версии

Я перепутал свой SVN-репозиторий, и теперь вам нужно вернуть весь репозиторий из 28-й до 28-й версии и не хотят иметь дело с различиями или конфликтами. Есть ли быстрый и простой способ сделать это? Я смог вернуть одиночные файлы до прекрасного с помощью команды merge, но в этом случае он хочет добавить все файлы обратно в репозиторий из версии 28, когда все, что я действительно хочу сделать, это удалить их.

Я использую командную строку в поле linux (bash).

Спасибо

ИЗМЕНИТЬ

Спасибо за помощь! Я исправил его:

svnadmin create /svnroot/<repo>.fixed
svnadmin dump -r 1:24 /svnroot/<repo> --incremental > dump.svn
svnadmin load /svnroot/<repo>.fixed < dump.svn

Затем ставим старое репо в резервном месте и перемещаем repo.fixed для репо.

Еще раз спасибо!

Ответ 1

Проверьте свалку/загрузку svnadmin. Он создает текстовый файл с каждой версией ваших файлов. Может быть возможно удалить все выше/ниже определенной точки и повторно импортировать его.

См. например Перенос данных репозитория в другом месте

Ответ 2

"Обратное" слияние может быть тем, что вам нужно. См. "undoing changes" в разделе svn book.

например. svn merge -r 28:24 [путь к svn]

Ответ 3

Если вам действительно нужно стереть "доказательство", что файлы когда-либо существовали, вам нужно выполнить описанные выше действия svndump/svnload.

В "нормальной" ситуации, когда вы допустили ошибку, вам нужно использовать обратное слияние. Это гарантирует, что отмена изменений после r24 также может быть отменена, изменена и т.д.

Приведенная ниже команда должна работать, чтобы отменить изменения (вам нужно зафиксировать результат слияния, чтобы отразить слияние в репозитории)

svn merge -r 28:24

Ответ 4

Если у вас есть доступ к серверу SVN, вы можете просто отредактировать path/db/current, поместить старый номер версии, который вы хотите вернуть (здесь: 24), и удалить ненужные файлы изменений (то есть 25, 26, 27, 28) из path/db/revs/0/. По крайней мере, это сработало для меня сегодня, после того как я случайно удалил каталог в репозитории.

Ответ 5

Если вы не пользуетесь правами администратора, вы не можете стереть старые версии, но вы можете скрыть их очень хорошо только с помощью одной удивительно простой команды "svn copy" (nickf и JesperE уже упомянули об этом, но довольно загадочным образом)/p >

svn удалить протокол://svnserver/some/resource
Протокол svn copy://svnserver/some/resource @24 protocol://svnserver/some/resource

И что он, исправления от 25 до 28 полностью исчезли из svn log. Это вовсе не хак, это безопасная и (едва ли...) документальная функция.

Если "resource" - это каталог, вы должны удалить его из последнего URL-адреса:

Протокол svn copy://svnserver/some/directory @24 protocol://svnserver/some/

(иначе вы бы скопировали его внутри себя)

Ответ 6

Для тех, кто использует TortoiseSVN, решение прост:

  • просмотреть журнал изменений
  • щелкните правой кнопкой мыши ревизию, которую вы хотите отменить, чтобы...
  • ... выберите "Вернуться к этой ревизии"
  • зафиксировать изменения

Этот метод сохраняет историю версий (т.е. все исправления, которые вы вернули).

Ответ 8

Если вы действительно хотите полностью удалить файлы из репозитория, вам нужно сделать svndump в файл, отфильтровать пути revs и/или файлов, которые вы не хотите, создать новое репо и svnload отфильтрованный дамп в новый репозиторий. Вы должны внимательно прочитать раздел книги SVN по обслуживанию хранилища, прежде чем вы это сделаете, и убедитесь, что вы не удаляете существующий репо, пока вы не убедитесь, что у нового есть нужный материал.

Ответ 9

Если структура папок вашего приложения не изменилась, проверьте старую ревизию и замените папки .svn с последней версии на проверенную старую ревизию. Теперь вы можете зафиксировать "более старую" версию.

Ответ 10

Мне очень жаль это говорить, но это ситуация, когда я обнаружил, что использую резервные копии своего репозитория svn.

Можете ли вы скопировать файлы определенной версии в новый каталог в репозитории?

Ответ 11

вот как я начал бы это делать. Жестокий, да, но это единственное, что гарантировало полное игнорирование столкновений и сохранение истории изменений неповрежденными.

  cd /scratchdir 
  svn co -r good svn://repository
  cd /hosed_project
  svn up -r HEAD
  cat >> /tmp/cp.sh 
  ORIG=$1
  TARG=$( echo $ORIG | sed 's/\/scratchdir\///' ); 
  cp $ORIG /hosed_project/$TARG;
  ^D
  chmod u+x /tmp/cp.sh
  find /scratchdir -not -wholename "*/.svn*" -exec /tmp/cp.sh {} \;

Обратите внимание, что это не "нормальный" способ ИМО, обычным способом является создание ветки из старой версии, а затем объединение этой ветки обратно в голову. (по крайней мере, то, как он работал)

Изменить: приведенный выше код не проверен, не запускайте его дословно

Ответ 12

Не могли бы вы svn del высшие каталоги, а затем svn copy их:

svn copy [email protected] svnurl 

Ответ 13

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

Когда вы находитесь в своем репозитории, используйте следующую команду:

svn update -r 24 trunk

Где 24 - номер версии, а trunk - это файл/папка, которую вы хотели бы обновить (или восстановить в этом случае) к указанному номеру ревизии.

В моем тесте несколько файлов были обновлены и (повторно) добавлены, и после выполнения фиксации я не получил никаких предупреждений вообще. Затем я модифицировал файл с помощью некоторого фиктивного текста и попробовал еще одну фиксацию, и только указанный файл появился в измененном списке. Так что это работает довольно хорошо!

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

-Dave

Ответ 14

Example:
    Rev 100 all is working great        
    Rev 101 somebody really corrupted the dir structure and / or merged in bad changes, etc.
    Rev 102 You delete /trunk
    Rev 103 You copy /[email protected] to HEAD
        You now have a /trunk that reflects only Rev 100 and 103. Not 101 or 102.

svn del svn://[RepoName]/trunk -m "removing issue in HEAD"
svn copy svn://[RepoName]/[email protected] svn://[RepoName]/trunk -m "Copy of correct revision of trunk to HEAD"