Подтвердить что ты не робот

Как un-версия файла в SVN изящно (без нарушения членов команды)?

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

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

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

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

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

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

4b9b3361

Ответ 1

Вы должны добавить все файлы, которые вы удаляете в список игнорирования (легко с TortoiseSVN → использовать команду "Удалить и добавить в игнор" ) и зафиксировать это.

Теперь выполните удаление.

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

Ответ 2

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

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

Ваши варианты следующие:

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

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