Як повернутися до старішої версії нашого коду в Subversion?


486

Я працюю над проектом з другом і хочу повернутися до старішої версії нашого коду і встановити його як поточну. Як це зробити?

Я використовую "anksvn" на vs08.

У мене є версія, яку я хочу на своєму ПК, але фіксація не вдається; Повідомлення, яке я отримую, - "помилка введення, файл або каталог застаріли".

У мене також є клієнт-підривник на своєму ПК.

Відповіді:


783

По суті, вам потрібно "об'єднати назад" - застосуйте різницю між поточною та попередньою версією до поточної версії (так ви отримаєте робочу копію, схожу на стару версію), а потім повторіть виконання. Так, наприклад, перейти від версії 150 (поточної) назад до версії 140:

svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"

Субверсійна Червона книга має хороший розділ про це .


3
але злиття не скасовує моїх змін та нової редакції.
Чен Кінрот

76
Якщо ви використовуєте TortoiseSVN, клацніть правою кнопкою миші файл, виберіть Злиття, а потім Об'єднайте діапазон змін. У полі журналу введіть 140-150 і натисніть кнопку "Зворотний". Після цього виконайте, як завжди. Це виконає ту саму операцію, що і приклад Йона.
DavGarcia

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

36
Щоб повернутися з головної редакції, ви також можете написати svn merge -r HEAD:140.
sschmeck

3
@ Інструкції TortoiseSVN від DavGarcia мені не підходили, принаймні, щоб не відновити всі файли в редакції (використовуючи TortoiseSVN 1.8.8). Клацніть правою кнопкою миші на папці, виберіть TortoisSVN-> Показати журнал. Виберіть версію, яку ви хочете відновити, клацніть правою кнопкою миші, як сказати "Скасувати зміни з цієї версії". Внесіть зміни.
mhenry1384

177

Ви можете здійснити нові зміни лише на чолі історії підриву.

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

Знайдіть хороший номер ревізії та поверніться

  1. Знайдіть номер редакції потрібної старої копії.

    Отримайте поточну версію за допомогою:

    svn info --show-item revision
    # or
    svn log

    Або для перевірки старих версій вашого проекту використовуйте:

    svn update -r <earlier_revision_number>

    поки ви не знайдете потрібний номер редакції.

  2. Запишіть хороший номер редакції (якщо привести 123приклади нижче).

  3. Оновлення до останньої редакції:

    svn update
  4. Скасуйте всі зміни між потрібною версією та останньою версією:

    svn merge -r HEAD:123 .
    svn commit "Reverted to revision 123"

    (те саме, що відповідь Джона Скіта вище.)

Якщо ви не можете знайти номер редакції

Якщо ви не можете знайти стару копію, а ви просто хочете ввести файли, які зараз є на вашому ПК:

  1. Зробіть копію вашої хорошої версії (але без .svnпапок):

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
  2. Тепер переконайтеся, що у вас є остання версія:

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
  3. Скопіюйте гарну версію на верхню частину робочої копії.

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

    cd ..
    rsync -ai --exclude=.svn --delete  project-good/  project/

    Якщо у вас немає rsync, ви можете використовувати, cp -aале вам також потрібно буде видалити всі непотрібні файли вручну.

  4. Ви повинні мати можливість здійснити те, що є зараз.

    cd project
    svn commit "Reverted to good copy"

2
svn не інтерпретує це як модифікацію, я не можу цього зробити.
Сандбург

svn merge -r HEAD: 12345. це правильна команда повернути, не робити оновлення -r. Ти божевільна людина.
Сова

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

36

Просто використовуйте цей рядок

оновлення svn -r yourOldRevesion

Ви можете дізнатися про свою поточну версію, скориставшись:

svn інформація


15
Це не вирішує проблему. Натомість це створює стан, в якому був запитувач, коли він задавав їх питання.
Інго Шальк-Шупп

1
Якщо вам не пощастило дотримуватися цієї поради, запустіть: "svn разрешить - принять рабочий -R".
Сова

27

Стандартний спосіб використання merge для скасування всієї реєстрації працює чудово, якщо це саме ви хочете зробити. Однак іноді все, що ви хочете зробити, це відновити один файл. Немає законного способу зробити це, але є злом:

  1. Знайдіть потрібну версію за допомогою журналу svn.
  2. Використовуйте експортну підкоманду svn:

    svn експорт http: // url-to-your-file @ 123 / tmp / filename

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


Використовуючи Tortoise-svn, я можу клацнути правою кнопкою миші один файл і об'єднати його. Має бути спосіб зробити це також, використовуючи svn?
лк.

10
svn cat -r 123 path-in-your-working-copy > path-in-your-working-copy
dash17291


5

Я думаю, що це найбільше підходить:

Виконайте злиття назад, наприклад, якщо введений код містить версію від rev 5612 до 5616, просто злийте його назад. Це працює в моєму кінці.

Наприклад:

svn merge -r 5616:5612 https://<your_svn_repository>/

Він містив би об'єднаний код назад до колишньої редакції, тоді ви можете скористатися ним.


3

Це те, що я зробив і працював для мене.

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

  1. Перейдіть до команди -> Показати історію.
  2. Клацніть правою кнопкою миші або діапазон змін, які ви хочете ігнорувати.
  3. Виберіть параметр "Повернути зміни".

Це призведе до зворотного злиття, скасування змін у вашій робочій копії.

Просто перегляньте код і введіть.


2

Клацніть правою кнопкою миші найвищу ієрархію, яку ви хочете відновити >> RevertабоRevert to Revision


2

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

Я випадково змінив файл із закінченнями рядків Unix на закінчення рядка DOS під час невеликої зміни та здійснив це. Це легко скасувати, або змінивши закінчення рядків і знову зробити, або шляхом зворотного злиття, але це призведе до того, щоб svn blameперерахувати моє редагування як джерело кожного рядка файла. (Цікаво, що TortoiseSVN в Windows не впливає на це; лише командний рядок svn blame.)

Якщо ви хочете зберегти історію, про яку повідомляється svn blame, я думаю, вам потрібно зробити наступне:

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

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

svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"

Зауважте, що для копії в сховищі призначенням повинен бути каталог, а не ім'я файлу.


1

Клацніть правою кнопкою миші проект> Замінити на> Перегляд або URL> Виберіть конкретну версію, яку ви хочете відновити.

Тепер прив’яжіть локальну версію коду оновлення до сховища. Це поверне базу коду до конкретної версії.


1

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

Правильний спосіб повернутися до версії:

svn merge -r HEAD:12345 .

Де 12345 - номер версії. Не забудьте крапку.


0

Синхронізуйте зі старішою версією та введіть її. Це повинно зробити трюк.

Ось також пояснення про скасування змін.


0

Відповідь Джона Скіта - це рішення в двох словах, але якщо ви схожі на мене, ви можете захотіти пояснення. Посібник з Subversion називає це a

Вишневе злиття

Із сторінок man.

  1. Ця форма називається злиттям «вишневого вибору»: '-r N: M' позначає різницю в історії джерельної гілки між редакціями N та M.

    "Зворотний діапазон" може бути використаний для скасування змін. Наприклад, коли джерело та ціль посилаються на одну і ту ж гілку, попередньо здійснене перегляд може бути "скасовано". У зворотному діапазоні N більше, ніж M у '-r N: M', або варіант '-c' використовується з від'ємним числом: '-c -M' еквівалентно '-r M:'. Скасування таких змін також відоме як виконання "зворотного злиття".


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

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

Приклад:

svn merge -r 2983:289 path/to/file

Це замінить локальну копію [2983] (яка, згідно з цитатою вище, повинна синхронізуватися з сервером - ваша відповідальність) з редакцією 289 з сервера. Зміна відбувається локально, а це означає, що якщо у вас є чистий замовлення, то зміни можна перевірити перед їх вчиненням.


-1

Наступне працювало для мене.

У мене було багато місцевих змін і мені потрібно було відмовитись від локальної копії та оформити останню стабільну версію в SVN.

  1. Перевірте стан усіх файлів, включаючи ігноровані файли.

  2. Обріжте всі рядки, щоб отримати нещодавно додані та проігноровані файли.

  3. Замініть ті на //.

  4. і rm -rf всі рядки.

    статус svn --no-ignore | grep '^ [? я]' | sed "s / ^ [? I] //" | xargs -I {} rm -rf "{}"

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