Как изящно удалить версию из файла в SVN (не мешая членам команды)? - PullRequest
22 голосов
/ 05 октября 2011

Вариации этого вопроса задавались ранее, но похоже, что проблема беспокойства других членов команды не упоминалась.В существующих сообщениях (см. Как "развернуть" файл в svn и / или git ) принятым ответом обычно является запуск svn rm FILE или svn rm --keep-local FILE, а затем установите свойство svn:ignore, еслижелательно.Последние 20 минут я потратил на то, чтобы поиграть с этим (проверить репо в двух местах, удалить файл из одного, затем обновить другой и т. Д.).Вот что я нашел (я использую SVN 1.6.16):

Прежде всего, из того, что я могу сказать, флаг --keep-local не влияет на то, что происходит со всеми, кто собираетсяОбновление из хранилища впоследствии.Для них это выглядит так же, как если бы вы только что выполнили обычный svn delete (ни в одной из документации по subversion, которую я видел, это не упоминается явно - возможно, должно быть очевидно, что вы все еще делаете операцию svn delete и чтоlocal "будет влиять только на локальную сторону, но это не обязательно было для меня очевидно).

Таким образом, есть два случая - 1. член команды A удаляет файл, в котором член команды B не имел локальных измененийв или 2. член команды A удаляет файл, в котором член команды B сделал незафиксированные локальные изменения в.

В 1, после того, как произойдет удаление, файл B был удален.Теперь он должен восстановить его самостоятельно (т. Е. svn merge -rHEAD:XXX FILE; svn revert FILE, чтобы вернуть версию XXX файла FILE в рабочий каталог и не повторять его при следующей фиксации)

В 2 B видит деревоКонфликт при обновлении, и FILE теперь имеет статус A + C с сообщением «локальное редактирование, входящее удаление при обновлении» под ним.На данный момент, я не совсем уверен, что рекомендуемое решение.Я просто скопировал ФАЙЛ куда-то еще, чтобы быть в безопасности, а затем запустил svn revert FILE.Это оказалось ненужным, потому что FILE все еще существует без изменений в рабочем каталоге с без изменений всех локальных изменений.Но я не знаю, насколько я доверяю этому, потому что мои незафиксированные изменения были стерты svn revert в других сценариях.

tl; dr : Это неужели тот случай, когда единственный способ отменить версию файла в SVN - это удалить его из рабочего каталога всех остальных членов команды и заставить их самостоятельно его извлечь?Я неправильно использую --keep-local или отсутствует другая аналогичная опция?

Ответы [ 2 ]

9 голосов
/ 05 октября 2011

Вы должны добавить все удаляемые файлы в список игнорирования (легко с помощью TortoiseSVN -> использовать опцию Удалить и добавить в список игнорирования) и зафиксировать это.

Теперь удалите.

Другой вариант - сделать svndumpfilter, как упомянуто здесь: Как удалить файл из svn-версий, не удаляя его из каждой рабочей копии?

1 голос
/ 05 октября 2011

Как только файл находится в хранилище Subversion, его нельзя полностью удалить. Конечно, вы можете сделать svn rm и зафиксировать удаление файла из самой последней копии этой ветви, но файл все еще там. Любой, кто проверяет ревизию до удаления файла, увидит файл. И вы можете легко найти удаленный файл, запустив svn log в дереве каталогов.

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

Ваш выбор следующий:

  • Снимите хранилище, затем выполните svnadmin dump. Используйте svnfilter, чтобы перенаправить дамп на svnadmin load, чтобы создать новую версию хранилища без любимого файла.
  • Подождите, пока Subversion 1.8, которая обещает иметь команду svn obliterate. (На самом деле, проверяя план, он больше не в версии 1.8. Может быть, 1.9?).

Флаг --keep-local просто сохраняет локальную копию файла после svn delete. По умолчанию файл удаляется локально из вашей рабочей области при svn delete.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...