Удалить файл со всей историей из хранилища SVN - PullRequest
36 голосов
/ 12 января 2010

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

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

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

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

Ответы [ 4 ]

33 голосов
/ 17 мая 2011

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

svndumpfilter exclude yourfileprefix < yourdump > yournewdump

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

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

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

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

6 голосов
/ 12 января 2010

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

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

4 голосов
/ 20 января 2015

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

0 голосов
/ 29 марта 2017

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

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

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

...