Який правильний спосіб відновити видалений файл із SVN?


119

Я видалив файл із репо-файлу і тепер хочу повернути його. Найкраще, що я можу зрозуміти, це:

  • оновлення до редакції перед видаленням
  • скопіюйте файли в іншому місці
  • оновлення до голови
  • скопіюйте файли назад
  • додайте їх
  • вчинити

Це просто погано пахне, і він втрачає всю історію для завантаження. Має бути кращий спосіб зробити це. Я вже заглянув у книгу SVN, але нічого не знайшов, і зараз переглядаю список тегів SVN.


4
Безумовно, відповідь тукушана - це правильна відповідь на ваше запитання, і її слід прийняти?
Джеймс Маккормак

@JamesMcCormack: див. NB у його відповіді.
BCS

2
Порада, якщо ви видалили файл і ще не здійснили зміни, просто натисніть правий клавіш і оновлення відновить його.
Хаммад Хан

Відповіді:


57

Використовувати svn злиття:

svn merge -c -[rev num that deleted the file] http://<path to repository>

Отож приклад:

svn merge -c -12345 https://svn.mysite.com/svn/repo/project/trunk
             ^ The negative is important

Для TortoiseSVN (я думаю ...)

  • Клацніть правою кнопкою миші в Провіднику, перейдіть до TortoiseSVN -> Злиття ...
  • Переконайтесь, що вибрано "Об'єднати діапазон змін", натисніть кнопку Далі
  • У текстовому полі "Діапазон редагувань для об'єднання" вкажіть версію, яка видалила файл
  • Установіть прапорець "Зворотне злиття", натисніть кнопку Далі
  • Клацніть Злиття

Однак це абсолютно не перевірено.


Під редакцією OP : Це працює на моїй версії TortoiseSVN (старий вид без наступної кнопки)

  • Перейдіть у папку, з якої було встановлено обмеження
  • Клацніть правою кнопкою миші в Провіднику, перейдіть до TortoiseSVN -> Злиття ...
  • у розділі Від введіть версію, яка видалила
  • у розділі Кому введіть редакцію перед видаленням.
  • Натисніть "об'єднати"
  • вчинити

Хитрість полягає в злитті назад . Кудо, щоб пришвидшити. Яскраво, що вказує на мене в правильному напрямку!


Редагувати: ми використовуємо різні версії. Описаний нами метод відмінно працював з моєю версією TortoiseSVN.

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


Я в Windows і не маю CLI-версії SVN. чи знаєте ви, як змусити ortoiseSVN це зробити?
BCS

Черепаха має "злитися" в меню правою кнопкою миші. У ньому є коробки, які потрібно заповнити для оборотів. Також "Dry Run", щоб побачити, чи правильно ви його встановили. І пам’ятайте, що результат не враховується, доки ви їх не зробите. Ви можете повернути, якщо це все перетинається.
gbarry

Я б сказав, що в ОП є старша версія черепахи. Більш новий має інший (нижчий) діалог злиття
1800 ІНФОРМАЦІЯ

Я ще не бачив жодної системи злиття, яка не смоктала. Текст, файли, dirs, Word docs, yuck. Я думаю, що це не вирішувана проблема. Речі OTOH можуть висмоктувати більш-менш. :)
BCS

1
Якщо ви відновите кілька файлів, а потім відновите один із ревертів, це неревертування. Ой! Я річ, я просто щось боляче.
BCS

176

Проблема з виконанням злиття svn, як запропонував Шон Брайт, полягає в тому, що він вводить інші зміни, внесені в тій же редакції, що і видалення. Копія svn - це більш цільова операція, яка впливатиме лише на видалені файли.

Використовуючи Tortoise SVN, ви можете воскресити файл, який був видалений із каталогу робочої копії та з пізніших версій SVN, за допомогою копії svn:

  • Перейдіть до робочої папки копії, яка раніше містила файл.
  • Клацніть правою кнопкою миші на папці в Провіднику, перейдіть до TortoiseSVN -> Показати журнал.
  • Клацніть правою кнопкою миші на номер редакції безпосередньо перед редакцією, яка видалила файл, та виберіть "Огляд сховища".
  • Клацніть правою кнопкою миші на видаленому файлі та виберіть "Копіювати в робочу копію ..." та збережіть.

Видалений файл тепер знаходитиметься в папці робочої копії. Щоб знову додати його до SVN, клацніть правою кнопкою миші на відреставрованому файлі та оберіть SVN Commit.

Примітка. Цей метод дозволить зберегти попередню історію відновленого файлу, однак, щоб побачити попередню історію в журналі TortoiseSVN, вам потрібно переконатися, що в діалоговому вікні Повідомлення журналу не встановлено прапорець "Зупинити на копіюванні / перейменувати".


26
Це також можна виконати безпосередньо на сервері, корисно, якщо видалені файли чи папка були досить великими: svn cp -r 1993 http://example.com/svn/trunk/path@1993 http://example.com/svn/trunk/path
Craig

Це правильний спосіб зробити це. Щойно спробував з TortoiseSVN 1.8.1, і він працює за порадами.
Доктор Джанлуїджі Зене Занеттіні

Ідеально !! Простий і ефективний. Дякую за рішення
Мисливець

Цей метод значно полегшив мені відновлення файлу у дочірньому відділенні, яке було видалено з його батьківської гілки. Можливо, був спосіб зробити це merge, але я цього не зрозумів.
arr_sea

"Тільки до початку" на кроці 3 важливо. На кроці 4 Tortoise продовжував скаржитися на те, що файл вже існує, навіть якщо я його видалив за допомогою Windows. Мені довелося спочатку оновити свою робочу копію. (Мій колега видалив кілька файлів за допомогою видалення Tortoise, а потім здійснив зміни.) TortoiseSVN 1.8.1.
leqid

27

Для повноти - це те, що ви знайшли б у книзі svn, якби ви знали, що шукати. Це ви вже виявили:

Скасування змін

Відновлення видалених елементів

Те саме, з новітньої (і детальної) версії книги:

Скасування змін

Відновлення видалених елементів


3
Просто йдеться про те, що більшість більшості проблем - це знати, на що звернути увагу.
BCS

16

Використовуйте функцію копіювання Tortoise SVN для відновлення внесених змін:

  1. Клацніть правою кнопкою миші батьківську папку, яка містить видалені файли / папки
  2. Виберіть "показ журналу"
  3. Виберіть і клацніть правою кнопкою миші версію, перед якою було здійснено зміни / видалення
  4. Виберіть "переглядати сховище"
  5. Виберіть файл / папку, яку потрібно відновити, і клацніть правою кнопкою миші
  6. Виберіть "Скопіювати в", яке буде копіювати файли / папки в головну версію

Сподіваюся, що це допомагає


13

Мені завжди здається, що копія svn використовується як серверна операція, тому не впевнений, чи працює вона з двома робочими контурами.

Ось приклад відновлення видаленого файлу в локальній робочій копії проекту:

svn copy https://repos/project/modules/module.js@3502 modules/module.js

Перебуваючи всередині каталогу проектів. Це добре працює і для відновлення цілих каталогів.


2
+1 Копія @ працювала. Схоже, що копія -r не працює для використання CollabNet svn 1.6.17 під Mac OSX.
Сірий

2
Також використовувана редакція повинна бути правом ревізії перед видаленням.
Сірий

6

Якщо ви використовуєте Tortoise SVN, ви повинні мати змогу повернути зміни з саме цієї версії до вашої робочої копії (ефективно виконуючи зворотне злиття), а потім виконайте ще одну зобов’язання повторно додати файл. Наступні кроки:

  1. Перейдіть до папки в робочій копії, де ви видалили файл.
  2. Перейдіть на репо-браузер.
  3. Перейдіть до редакції, де ви видалили файл.
  4. У списку змін знайдіть видалений файл.
  5. Клацніть правою кнопкою миші на файл та перейдіть до "Скасувати зміни з цієї версії".
  6. Це відновить файл у робочій копії, зберігаючи історію.
  7. Введіть файл, щоб додати його назад у ваше сховище.

Гаразд у цьому випадку питання полягало у тому, як зробити те, що ви тільки що описали. (Відповідь: використовувати злиття назад)
BCS

1
Я говорив про те, як це зробити у SVT Tortoise SVN. Додам докладніше.
davogones

5

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

Я використовую наступне в цьому випадку, і це працює досить добре.

svn copy -m 'restoring file' -r <rev_number_file_to_restore> http://from/file.cs http://pathTo/file.cs

Мені здається, я завжди використовую svn copyяк серверну операцію, тому не впевнений, чи працює він з двома робочими контурами.


3
SVN COPY - рекомендований підхід. Синтаксис дуже простий: копія svn [SVN URL] @ [REVISION # WHERE FILE существует] [ МІСЬКИЙ ШЛЯХ, ЩО ВІДПОВІДИТЬСЯ ] від visualsvn.com/support/svnbook/branchmerge/basicmerging . Просто використовував це сам.
Аміт

Це має для мене найбільше сенс, я також використовую такий підхід
Дмитро Пашкевич,

4

З черепаховим SVN :

Якщо ви ще не зробили своїх змін, ви можете виконати відновлення в батьківській папці, з якої ви видалили файл або каталог.

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


приємно. Я спробую це наступного разу.
BCS

1

Ви повинні мати можливість просто перевірити один файл, який ви хочете відновити. Спробуйте щось на зразок svn co svn://your_repos/path/to/file/you/want/to/restore@revдеrev є остання редакція, у якій файл існував.

Мені довелося зробити це саме деякий час тому, і якщо я правильно пам’ятаю, використовуючи -rопцію, щоб svnне працювати; Довелося використовувати :revсинтаксис. (Хоча я, можливо, пам’ятав це назад ...)


Це не те, що я хочу. Я хочу виправити файл назад у репо, і SVN знає, що це той самий файл.
BCS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.