Відкат або повернення цілого репозиторію svn до попередньої версії


75

Я зіпсував своє сховище SVN, і тепер мені потрібно повернути ціле сховище з версії 28 на 24 і не хочу мати справу з різницями чи конфліктами. Чи існує швидкий і простий спосіб зробити це? Я мав змогу повернути назад окремі файли до штрафу за допомогою команди злиття, але в цьому випадку він хоче додати всі файли назад у сховище з редакції 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

Потім помістіть старе репо в резервне місце та перемістіть репо. Закріплене до репо.

Знову дякую!

svn  revert 

3
Просто хотів подякувати за це. Я вивчаю svn і зіпсував переміщення деяких каталогів (виявилося, я зробив це в інший спосіб з причини!), І я хотів, щоб це не було. Ваше запитання врятувало мені багато клопоту.
AgentConundrum 02

Дякую, я вважаю, що це працює, але це займає стільки часу, коли у вашому сховищі є понад 10 тисяч версій. :(
Амір Пашазаде

Відповіді:


26

Перевірте скидання / завантаження svnadmin. Він створює текстовий файл із кожною версією ваших файлів. Можливо, можна видалити все, що знаходиться вище / нижче певної точки, та повторно імпортувати.

Див., Наприклад, Міграція даних сховища в іншому місці


2
Я розглядаю це зараз, дякую. Звичайно, я був змушений випадково ввести дамп svnadmin, не перекладаючи його, тому зараз весь мій проект пишеться в stdin (і не зупиняється за допомогою ctrl + c) ... Я більше не повторю цієї помилки: p

ГАРАЗД; Зараз я на правильному шляху, дякую! Але як я можу зробити так, щоб він зберігав мої виправлення? Я написав скрипт perl, який для 1, хоча 24 "svnadmin dump -r $ i: $ i + 1 <repos>> file", потім "svnadmin load <repos> <file", і він виконує лише перегляд 1.

1
Переконайтеся, що ви змінювали керівництво вашого сховища, перезавантажуючи резервну копію, коли змінюєте історію. В іншому випадку ви можете використовувати старі робочі копії зі зміненою базою даних і отримувати пізніше пошкоджені версії (оскільки вони були побудовані на дельтах на основі вже не існуючих версій).
Bert Huijben 01

25

Вам потрібно "зворотне" злиття. Див. Розділ "Скасування змін" книги svn.

Наприклад, злиття svn -r 28:24 [шлях до svn]


Це не видаляє файли, створені в 28. Проблема полягає в тому, що я додав купу файлів, яких мені не слід. Так, я справді зіпсувався. Вручну переслідувати те, що потрібно видалити, не може бути й мови. Я просто хочу "видалити" кожну реверсію після 24.

2
Вибачте - я, мабуть, не зовсім зрозумів вашу проблему. Я використовував зворотне злиття, щоб позбутися від нещодавно (але неправильно) доданих файлів кілька разів ... (але ваш випадок повинен дещо відрізнятися?) (Ви зазвичай не можете видаляти версії з репозиторію svn - додайте лише нові, що відновлюють помилки).
luapyad

Все, що вам потрібно зробити, - це об’єднати назад, як показує відповідь, а потім знову перевірити свій проект у ( svn ci -m "Revering all changes back to revision X"). Все ще можна буде перевірити погані версії, однак це поверне потрібну вам редакцію в HEAD.
Пол Нельсон Бейкер,

14

Якщо у вас є доступ до SVN-сервера, ви можете просто відредагувати path/db/current, помістити туди старий номер редакції, на який ви хочете повернутися (тут: 24), і видалити з нього більше не потрібні файли версій (тобто 25, 26, 27, 28) path/db/revs/0/. Принаймні, це працювало у мене сьогодні, після того, як я випадково видалив каталог зі сховища.


На сьогоднішній день це найшвидша найпростіша справа, і я вже використовував цей трюк у минулому. Однак це погана звичка, і я ніколи б не робив цього в репо, яке використовувалось кимось іншим або в якому були критичні дані. Краще правильно перейти через інструменти адміністратора.
Тинам

Я не знаю всього, що могло статися, але знаю, що це може створити проблеми пізніше, тому що колись я мав проблему з наступним комітом, зробивши саме це. Сказавши це, я зробив це кілька разів успішно, і, звичайно, ти спочатку зробив резервну копію свого репо, так? (Звичайно, одна очевидна проблема полягає в тому, що кеш старої робочої копії стану репо не буде збігатися з фактичним репо після того, як ви це зробите, тому завжди робіть свіжу перевірку відразу після і працюйте з цього, або невідповідність дуже ймовірно викликати проблеми з фіксацією.)
Тинам

О, це брудно ... але, здається, працює. Однак мені довелося балотуватися svnadmin recover /path/to/repo, щоб мати змогу скоїти знову.
lxg

Варто зазначити, що файли знаходяться лише в тому path/db/revs/0випадку, якщо у вас менше 1000 комітів. Якщо у вас більше цього, файли знаходяться path/db/revs/Xтам, де X - номер
Майкл Ферт,

13

Якщо вам дійсно потрібно стерти "докази" існування файлів, вам потрібно виконати описані вище дії svndump / svnload.

У "звичайній" ситуації, коли ви допустили помилку, вам потрібно використовувати зворотне об'єднання. Це гарантує, що скасування змін після r24 також може бути скасовано, змінено тощо.

Наведена нижче команда повинна працювати, щоб скасувати ваші зміни (вам потрібно зафіксувати результат злиття, щоб відобразити злиття у сховищі)

svn merge -r 28:24

1
Ха-ха, ну я міг би докладно розповісти про те, як це не "нормальна" ситуація, але волів би не бентежити себе далі

1
"Ненормальна" ситуація буде, якщо ви вчинили щось секретне, наприклад, файл, що містить пароль або щось подібне; ви хотіли б, щоб це було повністю видалено. Останні новини про це щось починали на "svn
obliterate

6

Якщо ви не користуєтеся правами адміністратора, ви не можете видалити будь-які старі версії, АЛЕ ви все одно можете надзвичайно добре їх приховати лише однією дивовижно простою командою "svn copy" (nickf та JesperE вже згадали про це, але досить загадково)

svn delete protocol: // svnserver / some / resource
протокол копіювання svn: // svnserver / some / resource @ 24 протокол: // svnserver / some / resource

І все, версії 25-28 повністю зникли з журналу svn. Це зовсім не хакерство, це безпечна та (ледве ...) задокументована функція.

Якщо "ресурс" - це каталог, ви повинні вилучити його з останньої URL-адреси:

протокол копіювання svn: // svnserver / some / directory @ 24 протокол: // svnserver / some /

(інакше ви б скопіювали його всередину себе)


Якщо svn copy prot://srv/path/proj ...команда видає вам помилку типу "svn: E170000: ... знаходиться не в тому ж сховищі, що і ...", тоді ви можете обійти це, виконавши svn checkout prot://srv/path/proj@321 coolverтоді svn copy coolver/proj prot://srv/path/; # ftw!
MarkHu

5

Для всіх, хто використовує TortoiseSVN, рішення просте:

  • переглянути журнал змін
  • клацніть правою кнопкою миші версію, до якої потрібно повернутися ...
  • ... виберіть "Повернутися до цієї версії"
  • внесіть свої зміни

Цей метод зберігає історію версій (тобто всі зміни, які ви скасували).


Я використовував більш-менш те, що ви сказали тут, тому що історія версій зберігалася, але те, що я зробив, було видалення вихідного коду моєї робочої копії, а потім вибрав "Оновити елементи до ревізії" (оскільки "повернутися до цієї версії" не вийшло файли, створені після перегляду). Чудове рішення для користувачів TortoiseSVN :)
Ігнасіо Рубіо 02

Я майже впевнений, що питання
стосувалося

Цей варіант не існує в TortoiseSVN, принаймні не в 2018 році.
Rockin4Life33

3

Ви можете зробити нову перевірку певної версії. http://svnbook.red-bean.com/en/1.1/re04.html

svn co path/to/my/repo -r 24

Я це вже зробив, але він відмовляється повертати дані до сховища як нову редакцію. Чи можна це зробити? Тобто внести редакцію 29 до копії редакції 24?

Так. Команда svn copy може робити repo -> repo copy. Поставте прапорець "svn help copy" для точного синтаксису.
JesperE

2

Якщо структура папок у вашому додатку не змінилася, перевірте стару редакцію та замініть папки .svn з останньої версії на перевірену стару версію. Тепер ви можете зафіксувати "старішу" версію.


2
Чесно кажучи, це для мене звучить як хак.
Сандер Рейкен

На жаль, структура папок суттєво змінилася, інакше я просто видалив би те, що потрібно було видалити вручну. Дякую за вхід.

1
Я згоден, що це хакерство; але це одноразова ситуація, тому я не впевнений, чи шукатиму найбільш елегантне рішення. Вистачило б чогось швидкого та легкого.
ніш

1

Якщо ви дійсно хочете повністю видалити файли зі сховища, вам потрібно зробити svndump у файл, відфільтрувати revs та / або шляхи до файлів, які ви не хочете, зробити нове репо та завантажити відфільтрований дамп у новий сховище. Вам слід уважно прочитати розділ книги SVN про обслуговування сховища, перш ніж робити щось із цього, і переконайтеся, що не видаляєте існуюче репо, поки не переконаєтесь, що в новому є потрібні речі.


1

Не могли б ви svn delнайвищі каталоги, а потім svn copyїх:

svn copy svnurl@version svnurl 

0

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

Чи можете ви скопіювати файли певної версії в новий каталог у сховищі?


Резервне копіювання SVN само по собі звучить безглуздо, але, здається, це те, що я мав би зробити в першу чергу: /

У мене були зіпсовані сховища svn, і це не весело. Я часто роблю резервні копії та зберігаю копії у сейфі в банку.

Резервне копіювання - це хороша практика, але відновлення з резервної копії в цій ситуації не повинно бути необхідним.
Сандер Рейкен

0

ось як би я почав це робити. Так, але жорстоко, але це єдине, що гарантує повністю ігнорування зіткнень та збереження історії змін.

  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, звичайний спосіб - створити гілку зі старої версії, а потім об'єднати цю гілку назад у головку. (принаймні, так раніше працювало)

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


0

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

Коли ви знаходитесь у своєму сховищі, використовуйте таку команду:

svn update -r 24 trunk

Де 24 - номер редакції, а стовбур - файл / папка, який ви хочете оновити (або відновити, у цьому випадку) до вказаного номера редакції.

У моєму тесті було оновлено та (повторно) додано декілька файлів, і після фіксації я не отримував жодних попереджень. Потім я змінив файл з деяким фіктивним текстом і спробував ще один коміт, і лише зазначений файл з’явився у зміненому списку. Отже, це працює досить добре!

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

-Дейв


Це лише оновлює вашу робочу копію до цієї попередньої версії і не дає жодного способу зробити це, як зазначено вище.
Сандер Рейкен

Ти впевнений? Я спробував це в тестовому середовищі, і, здавалося б, добре? Хоча я можу помилитися.

Якщо файл був перероблений після r24, і ви внесли його зміни, тоді svn не зможе внести до нього жодних змін і вимагатиме спочатку оновити HEAD
Вім Коен

0
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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.