Як відновити фіксацію SVN?


303

Я знайшов різні приклади, як повернути SVV-файл, як-от

svn merge -r [current_version]:[previous_version] [repository_url]

або

svn merge -c -[R] .

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

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


16
Ви ніколи не приймали відповідь, бо жодна з них не працювала?
2rs2ts

4
Якщо ви хочете дослівну відповідь, використовуйте "svn merge -c -1944." Щоб перевірити, чи спрацювало: "svn diff"
Джон Сампсон



Що робити, якщо у мене є 1943 рік (добрий вчинок), потім 1944 рік (поганий вчинок), потім 1945 рік (хороший вчинок), потім 1946 р. (Хороший вчинок). Тепер я хочу видалити лише 1944 рік (погана фіксація) та зберегти всі зміни після 1944 року, значить, я хочу такий результат, як 1943,1945,1946 (видалити лише 1944 рік) з усіх цих версій, що мені робити ??
Bhavin_m

Відповіді:


447

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

svn merge -r UPREV:LOWREV . скасувати діапазон

svn merge -c -REV . скасувати єдину редакцію

у цьому синтаксисі - якщо поточний dir є WC і (як це потрібно робити після кожного злиття), ви будете робити результати

Ви хочете бачити журнали?


9
@dwjohnston - так, злиття завжди виконуються в туалеті, і це не завдання на стороні сервера
Lazy Badger

14
svn: Merge source required. Без кісток.
2rs2ts

27
@ 2rs2ts виглядає так, що ви забули крапку, щоб позначити "зробити це в поточному каталозі".
Далін

14
Ви також можете одночасно виконати кілька одноразових svn merge -c -42587,-42589 .
комісій

1
@ahnbizcad - редакція (сингл), яку потрібно скасувати
Ледачий борсук

130

Якщо ви використовуєте клієнт TortoiseSVN , це легко зробити через діалогове вікно Показати журнал .


5
Це, безумовно, найпростіший спосіб
Марку К.

5
Це застаріло. У поточній версії для клієнта більше не доступне контекстне меню.
користувач1789573

19
Що? TortoiseSVN - це контекстне меню, а також діалогові вікна, які він породжує. Що ви маєте на увазі під "контекстним меню більше не існує"? Там, безумовно, є!
Бен

@Ben Я думаю, що користувач1789573 трохи спонукався до явної згадки про "контекстне меню" у підручнику, пов'язаному у відповіді.
Том Катулло,

2
Якщо ви бачите це пізніше, він є (все-таки) там. На екрані журналу шоу клацніть правою кнопкою миші версію та є опція "Повернутися до цієї редакції". Це в TortoiseSVN 1.9.4 Build 27285. Я просто його використав і можу сказати, що він працює чудово.
Брюс Ван Хорн

64

svn merge -r 1944:1943 .має відновити зміни r1944 у вашій робочій копії. Потім ви можете переглянути зміни у вашій робочій копії (з розл.), Але вам потрібно буде виконати зобов'язання, щоб застосувати відновлення до сховища.


4
Не працює, вимагає злиття джерела. Намагався svn merge -r 1944:1943 .натомість, але нічого не змінилося.
Олексій

Чи просунулося сховище з r1944? Якщо так, чи існують суперечливі зміни в тих самих рядках, що і зміни між r1943 та r1944?
onon15

Я переглядаю 1945 рік, і, здається, не виникає конфлікту. Ні svn statusі svn diffнічого не дає.
Олексій

7
Помилка:svn: Try 'svn help' for more info svn: Merge source required
Олексій

5
Але, svn merge -r 1945:1943 .схоже, спрацювали. Я думаю, що я розумію: Вам потрібно об'єднати версію з "до", щоб "поганий" ввести у ваше робоче сховище. Це нормально, коли ви хочете виконати просте "повернення" попереднього комітету. Але що робити, якщо ви хочете відновити зміни, внесені у версії 1900?
Олексій

44

По-перше, поверніть робочу копію до 1943 року.

> svn merge -c -1943 .

По-друге, перевірте, що збирається здійснити.

> svn status

По-третє, версія 1945 року.

> svn commit -m "Fix bad commit."

По-четверте, подивіться на новий журнал.

> svn log -l 4

------------------------------------------------------------------------
1945 | myname | 2015-04-20 19:20:51 -0700 (Mon, 20 Apr 2015) | 1 line

Fix bad commit.
------------------------------------------------------------------------
1944 | myname | 2015-04-20 19:09:58 -0700 (Mon, 20 Apr 2015) | 1 line

This is the bad commit that I made.
------------------------------------------------------------------------
1943 | myname | 2015-04-20 18:36:45 -0700 (Mon, 20 Apr 2015) | 1 line

This was a good commit.
------------------------------------------------------------------------

1
Що робити, якщо у мене є 1943 рік (добрий вчинок), потім 1944 рік (поганий вчинок), потім 1945 рік (хороший вчинок), потім 1946 р. (Хороший вчинок). Тепер я хочу видалити лише 1944 рік (погана фіксація) та зберегти всі зміни після 1944 року, значить, я хочу такий результат, як 1943,1945,1946 (видалити лише 1944 рік) з усіх цих версій, що мені робити ??
Bhavin_m

26

Неможливо "скасувати" версію, але ви можете повернути свою робочу копію до версії 1943 та виконати її як версію 1945 року. Версії 1943 та 1945 будуть ідентичними, що фактично поверне зміни.


18
Щоби бути прикро точним, я б прокоментував, що якщо у вас є доступ адміністратора до сховища, ви можете "скасувати". Це створюється сховище клонів до заданої редакції за допомогою, svn dumpа потім svn load. Але, звичайно, це не слід використовувати в звичайних умовах.
onon15

4
Я не хочу скасувати розмову, я хочу створити новий номер комісії з певною переверненою коміткою. Зазначає, що я перевірив версію 1944 року, взяв на себе зобов’язання в 1945 році, яку хочу "повернути". Тоді я хочу мати версію 1946, файли якої ідентичні файлу у версії 1944. (За винятком історії, звичайно.) Але залишається питання: як це зробити? Які команди?
Олексій

//, @Alex, мене теж цікавить це, особливо в чомусь аналогічному $ git revert. Мені було важко засвоїти SVN після використання Git так довго.
Натан Басанес

9

Наступне зробить сухий пробіг, як мовиться. HEAD - це поточна версія, PREV - попередня, тоді шлях до вашого файлу або до об'єкта:

svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk

Якщо сухий запуск виглядає добре, виконайте команду без --dry-run

Перевірте зміни в редагуванні та повторному введенні. Щоб переглянути номери версій, спробуйте:

svn log

4
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F

Це вимагає, щоб локальна копія відрізнялася від поганої редакції?
Miron


2

Хоча наведені пропозиції можуть працювати для деяких людей, це не працює для мого випадку. Під час виконання злиття користувачі, rev 1443які оновлюються rev 1445, все ще синхронізують усі змінені файли, 1444навіть якщо вони рівні 1443з об'єднанням. Мені потрібні кінцеві користувачі, щоб не бачити оновлення взагалі.

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

copy -r 1443 file:///<your_branch> file:///<your_branch_at_correct_rev>
svn move file:///<your_branch> file:///<backup_branch>
svn move file:///<your_branch_at_correct_rev> file:///<your_branch>

Це працювало для мене, можливо, це буде корисно комусь іншому там =)


2
svn merge -c -M PATH

Це врятувало мені життя.

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


1

Я спробував вище, ( svn merge) і ти маєш рацію, це робить джек. Однак

svn update -r <revision> <target> [-R]

здається, працює, але не є постійним (мій svn просто показує стару версію). Тож довелося

mv <target> <target backup>
svn update <target>
mv <target backup> <target>
svn commit -m "Reverted commit on <target>" <target>

У моєму конкретному випадку моя мета interfaces/AngelInterface.php. Я вніс зміни у файл, здійснив їх, оновив комп'ютер збірки, запустив компілятор phpdoc і виявив, що мої зміни були марною тратою часу. svn log interfaces/AngelInterface.phpпоказує мою зміну як r22060, і попередня фіксація цього файлу була r22059. Так що я можу, svn update -r 22059 interfaces/AngelInterface.phpі я закінчую кодом, як це було в -r22059 знову. Тоді :-

mv interfaces/AngelInterface.php interfaces/AngelInterface.php~
svn update interfaces/AngelInterface.php
mv interfaces/AngelInterface.php~ interfaces/AngelInterface.php
svn commit -m "reverted -r22060" interfaces/AngelInterface.php

Крім того, я можу зробити те ж саме в каталозі, вказавши . -Rна місце interfaces/AngelInterface.phpу всьому вище.


1
Ще одна річ, як уже було сказано, те, що ви не можете зробити, - це видалити фіксацію з історії, як ви можете це зробити в git, прямо взломивши рефлекси. Все, що ви можете зробити, - це скористатися сховищем, щоб змінити джерело на те, як ви маєте намір, і зробити це як зміна.
сибаз

Дослідивши далі, я можу побачити, що можна видалити фіксацію з історії за допомогою svnadmin, але ви настійно не радимо це робити. Див stackoverflow.com/questions/5566327 / ...
sibaz

0

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

svnrdump dump -r 1:<rev> <url> > filename.dump

Команда svnrdump виконує ту ж функцію, що й дамп svnadmin, але працює на віддаленому репо.

Далі просто імпортуйте дамп-файл у ваше репо за вибором. Це було випробувано, щоб добре працювати на Beanstalk.

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