Какая разница между 'delete' и 'unversion' в SVN?

У меня есть файл, который находился под контролем версий в SVN (я использую tortoiseSVN). Этот файл устарел, поэтому я больше не хочу, чтобы он был в рабочей копии моего репо. Однако, вероятно, было бы хорошо сохранить историю этого файла.

Я по сути хочу "удалить" этот файл, чтобы он больше не отслеживался или не был "версированным". У меня есть возможность либо "удалить" этот файл, либо "отменить" этот файл.

В чем разница между "delete" и "unversion". Какие варианты использования для каждой команды?

Ответ 1

Удаление файла из svn, не удаляет его историю изменений.
Очевидно, что удаление истории возможно [SO]: удалить файл со всеми история из репозитория svn.

Чтобы упростить ситуацию, рассмотрим следующую аналогию.
Из svn PoV, как:

  • a (источник) файл состоит из:
    • последовательность элементов: строки (кода)

То же самое:

  • a папка состоит из:
    • последовательность элементов: ее дети:
      • (суб) папки
      • файлы

Скажем, что у нас есть файл svn:

  • В редакции M строка кода (пусть она станет последней, чтобы лучше проиллюстрировать пример) в этом файле была изменена
  • В версии N ( > M) эта строка была удалена

Ситуация такова:

  • Для изменений файлов, больших N, строка не будет присутствовать
  • Для изменений файлов между M и N строка будет иметь свой последний контент
  • Для версий файлов, меньших, чем M, строка будет иметь старое содержимое
  • ....

То же самое произошло бы при удалении файла (из перспективы его родительской папки).

Теперь вернемся к вашему вопросу: на моем TortoiseSVN (v1.9.5):

  • У меня есть опция удаления
  • У меня нет опции Unversion, но
  • У меня есть опция Delete (keep local) - которая является (лучше назвать, возможно, для) Unversion. В терминах командной строки это эквивалентно svn delete --keep-local

После выполнения одного из действий над файлом этот файл больше не будет отслеживаться с помощью svn, но в отличие от Delete (где файл также удаляется из рабочей копии/диска), Unversion оставит его на диске точно так же, как пользователь вручную скопировал его там (последующий svn st будет "видеть" файл как не находящийся под контролем версии: первый столбец будет вопросительным знаком (?), как описано в разделе [SVNBook]: svn status).

[TortoiseSVN]: удаление, перемещение и переименование содержит очень мало официальной информации.

Лично я не вижу использования локального файла, кроме случаев, когда исправляется ошибка, например. удаление ранее зафиксированных элементов, которые не принадлежат репозиторию (зависит от пользователя), например:

  • Eclipse:.classpath,.project
  • PyCharm:.idea
  • VStudio:.vcxproj.user

Цитата из [SVNBook]: svn delete:

Используйте параметр -keep-local, чтобы переопределить поведение по умолчанию svn delete, также удалив целевой файл, который был запланирован для удаления версии. Это полезно, когда вы осознаете, что случайно сделали добавление файла, который вам нужно сохранить в своей рабочей копии, но который не должен был быть добавлен в управление версиями.