Откат или возврат всего хранилища SVN в старую ревизию - PullRequest
74 голосов
/ 31 декабря 2008

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

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

Спасибо

EDIT

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

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

Затем поместите старое хранилище в резервное хранилище и переместите хранилище в фиксированное хранилище.

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

Ответы [ 14 ]

1 голос
/ 31 декабря 2008

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

  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 {} \;

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

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

1 голос
/ 31 декабря 2008

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

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

0 голосов
/ 21 октября 2010
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 /trunk@100 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]/trunk@100 svn://[RepoName]/trunk -m "Copy of correct revision of trunk to HEAD"
0 голосов
/ 31 декабря 2008

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

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

svn update -r 24 trunk

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

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

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

-Dave

...