Как удалить 1 ревизию папки в Subversion
У меня есть несколько проектов в моем хранилище, каждый проект имеет свою собственную папку. Можно ли удалить последнюю ревизию одного из проектов, ничего не меняя?
Пример: последняя версия Project A была зафиксирована при создании rev. 50. Работа над другими проектами продолжается, репозиторий сейчас на ред. 60.
Теперь пользователь A возвращается и просит удалить изменения последней версии, потому что они не работают для него. Он хочет вернуться к предыдущей версии, и все дальнейшие изменения должны быть сделаны начиная с этого.
На данный момент я хотел бы rev. 50 исчезнуть, так что проект А может продолжаться, как будто оборот. 50 никогда не было.
Единственный способ, которым я могу видеть, - это создать ветку и отныне работать над этой веткой. Но это просто создает много веток с течением времени, и история проекта становится загроможденной.
Какое хорошее решение для этого сценария?
5 ответов
- Сделайте обновление, чтобы убедиться, что ваша рабочая копия обновлена. Убедитесь, что ваша рабочая копия чистая, без ожидающих изменений.
- Щелкните правой кнопкой мыши на корневой папке рабочей копии вашего проекта и выберите "показать журнал".
- Выберите (с помощью Ctrl / Shift, чтобы выбрать несколько) ревизии, которые вы хотите отменить
- Щелкните правой кнопкой мыши выбранные ревизии и "отменить изменения из этих ревизий"
- Проверьте изменения, внесенные операцией отмены в вашу рабочую копию. Разрешите любые конфликты, если это необходимо.
- Зафиксируйте изменения
Ответ Габриэля Херли, который вы в настоящее время приняли, не имеет смысла: невозможно выполнить коммит после "обновления до ревизии". Эта операция откатывает 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
, они будут обновлены до последней версии без суеты на всех. Нет слияния, чтобы бороться с чем-либо.