Удалить файл со всей историей из репозитория svn

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

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

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

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

Ответ 1

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

svndumpfilter exclude yourfileprefix < yourdump > yournewdump

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

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

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

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

Ответ 2

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

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

Ответ 3

Я столкнулся с аналогичной проблемой, за исключением того, что мне нужно было удалить несколько файлов, а не только один файл, а также мы находимся в 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"

Ответ 4

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

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

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