Как удалить 1 ревизию папки в Subversion

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

Пример: последняя версия Project A была зафиксирована при создании rev. 50. Работа над другими проектами продолжается, репозиторий сейчас на ред. 60.

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

На данный момент я хотел бы rev. 50 исчезнуть, так что проект А может продолжаться, как будто оборот. 50 никогда не было.

Единственный способ, которым я могу видеть, - это создать ветку и отныне работать над этой веткой. Но это просто создает много веток с течением времени, и история проекта становится загроможденной.

Какое хорошее решение для этого сценария?

5 ответов

Решение
  1. Сделайте обновление, чтобы убедиться, что ваша рабочая копия обновлена. Убедитесь, что ваша рабочая копия чистая, без ожидающих изменений.
  2. Щелкните правой кнопкой мыши на корневой папке рабочей копии вашего проекта и выберите "показать журнал".
  3. Выберите (с помощью Ctrl / Shift, чтобы выбрать несколько) ревизии, которые вы хотите отменить
  4. Щелкните правой кнопкой мыши выбранные ревизии и "отменить изменения из этих ревизий"
  5. Проверьте изменения, внесенные операцией отмены в вашу рабочую копию. Разрешите любые конфликты, если это необходимо.
  6. Зафиксируйте изменения

Ответ Габриэля Херли, который вы в настоящее время приняли, не имеет смысла: невозможно выполнить коммит после "обновления до ревизии". Эта операция откатывает BASE ревизия, на которой основана ваша рабочая копия. При попытке зафиксировать изменения, Subversion будет жаловаться, что файлы и папки устарели.

Вы хотите, чтобы вернуться к ревизии или отменить изменения от функций ревизии, а не "обновить до ревизии".

Короткий ответ, ты не. Действительно сложно стереть коммит из репозитория Subversion. Намеренно так.

Практически нужно вернуть этот каталог обратно в редакцию 49, а затем зафиксировать его как версию 61.

Главное, что вы возвращаете ТОЛЬКО рассматриваемый каталог, а не всю проверку.

Вот соответствующая ссылка на книгу SVN: http://svnbook.red-bean.com/en/1.0/svn-book.html

Вам нужна команда вида "svn merge -r 60:50 xxx://path"

Вы возвращаетесь и получаете файл в том состоянии, в котором он находился в редакции 50 (используя "обновление до редакции"), а затем повторно объединяете его с текущей версией, если были какие-либо последующие изменения, которые вы хотите сохранить. В противном случае вы можете просто выполнить обновление до ревизии, а затем повторно отправить файл.

Там нет автоматического способа сделать это, но с небольшой ручной работой это выполнимо. Это магия контроля версий.

Если вы хотите изменения 51:60

svn merge -r 50:49 A/trunk/
#the most painful experience in your life
svn commit -m "reverting to rev49"

Обратите внимание, что это часто просто не работает.

если вы хотите изменения 51:60, ручной способ

svn diff -r 50:49 A/trunk/
#review changes from the diff and apply them. or patch.
svn commit -m "reverting to rev49"

Все остальные ответы хороши, если у вас есть изменение, которое вы хотите отменить, не затрагивая другие изменения, произошедшие в той же папке.

Если я правильно понимаю ваш вариант использования, вас не волнуют другие изменения в проекте A, потому что их нет. Вы просто хотите, чтобы проект А вернулся к тому, что был до ревизии 50. Если это так, то существует гораздо более простое решение (и с гораздо меньшим количеством горя, чем слияние и разрешение конфликтов):

svn del full://url/to/project/A
svn cp full://url/to/project/A@49 full://url/to/project/A

Это в основном "удаляет" текущий HEAD проекта A из репозитория (он все еще в истории), а затем вместо этого копирует более старую копию проекта (до проблемной фиксации).

Эта процедура настолько прозрачна, что если кто-то с проверкой A (из ревизии 50 или позже) делает svn update, они будут обновлены до последней версии без суеты на всех. Нет слияния, чтобы бороться с чем-либо.

Другие вопросы по тегам