it-roy-ru.com

Удалить файл со всей историей из хранилища SVN

Есть ли способ удалить файл из хранилища SVN, включая всю его историю? Эта проблема возникает, когда я хочу избавиться от больших двоичных файлов, находящихся в репо. 

Я знаю только один подход, который может помочь в этой ситуации:

  1. Сбросьте все репо с помощью утилиты svnadmin.
  2. Отфильтруйте выгруженный файл с помощью grep. Grep должен использовать имя файла и записать в другой дамп-файл
  3. Импортируйте последний дамп-файл с помощью svnadmin

Но это слишком сложно и ненадежно. Может быть, есть другое решение?

35
altern

В последнее время это стало намного проще с командой svndumpfilter. Подробности доступны в документации Subversion здесь . В основном, чтобы избежать конфликтов (объяснено здесь ), он принимает дамп репо и повторяет каждый коммит, включая или исключая данный префикс файла. Основной синтаксис:

svndumpfilter exclude yourfileprefix < yourdump > yournewdump

Исключение - это, вероятно, вопрос, который ищет задающий вопрос, но вы также можете использовать include, скажем, для извлечения поддерева репо, чтобы выделить его как свой собственный репозиторий.

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

svndumpfilter exclude --pattern '*.pdf' < dump > dump_nopdfs

Дополнительную информацию об использовании можно узнать, позвонив svndumpfilter help и svndumpfilter help exclude.

32
John McDonnell

Но это слишком сложно и ненадежно. 

Я не знаю, почему это не следует считать надежным. Однако, если вы хотите полностью избавиться от файла, истории и всего, независимо от того, какое влияние он оказывал на предыдущие ревизии, частью которых был этот файл, существует только один способ сделать это, и этот способ действительно сложен. И это правильно. SVN - это инструмент с единственной целью: никогда не терять файл, даже после его удаления. Заставить это сделать иначе должно быть трудно. 

6
sbi

Я столкнулся с подобной проблемой, за исключением того, что мне нужно было удалить несколько файлов, а не только один файл, а также мы находимся на Subversion 1.6, которая не поддерживает директиву --patern. 

- резервный текущий SVN

$ cp -R /svn  /svnSAVE

- хранилище дампов

$ svnadmin dump /svn/root > svnDump

- создать новый дамп, исключая очень большой файл

$ svndumpfilter exclude "/path/file.csv" < svnDump > newSvnDump0
-- {note: should see a message like this}:
--          Dropped 1 node:
--                  '/path/file.csv'

- создать еще один новый дамп, исключив еще один очень большой файл

$ svndumpfilter exclude "/path/anotherFile.csv" < newSvnDump0 > newSvnDump1

- удалить старый SVN 

$ rm -rf /svn

- воссоздать каталоги SVN

$ mkdir -p /svn/root

- воссоздать SVN

$ svnadmin create /svn/root

- заселить свежий репозиторий дампом

$ cat newSvnDump1 | svnadmin load /svn/root

- обновить файлы conf из сохраненной копии в новую копию ...

$ cp /svnSAVE/root/conf/* /svn/root/conf

Теперь хранилище не должно содержать 2 больших файла "file.csv" и "anotherFile.csv"

3
user3892260

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

Если у вас есть огромное количество, например, файлов .o, случайно проверенных в каталоге сборки, это может не подходить. Но если вы удаляете кучу двоичных артефактов, которые вам не нужны, из каталога, который содержит кучу двоичных артефактов, которые вы действительно хотите, вы рискуете совершить дорогостоящую ошибку. Как минимум, рассмотрите возможность удаления их из ствола и большинства ветвей, но оставьте ветвь функции, заполненную текстовыми файлами-заполнителями с хешем исходного двоичного файла. Этого может быть, по крайней мере, достаточно, чтобы выяснить, что произошло позже, убедиться, что случайная копия, которая не должна была быть удалена, на самом деле является правильным файлом, и вернуть его под контроль версий.

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

0
breakpoint