Как определить и потенциально удалить большие двоичные преступления внутри репозитория SVN?

StackOverflow https://stackoverflow.com/questions/2176803

  •  24-09-2019
  •  | 
  •  

Вопрос

Я работаю с репозиторий SVN, который более 3 лет, содержит более 6100 коммитов и составляет более 1,5 ГБ по размеру. Я хочу уменьшить размер репозитория SVN (я не говорю о размере полного экспорта SVN - я имею в виду полный репозиторий, поскольку он будет существовать на сервере), прежде чем перемещать его на новый сервер.

Текущий репозиторий содержит исходный код для всех наших программных проектов, но также содержит относительно большие двоичные файлы без значимости, такого как:

  • Полные установщики для ряда 3-го вечеринок.
  • .jpg & .png файлы (которые немодифицированы экспорт PSDS, которые живут в одной папке).
  • Папки Bin и OBJ (которые затем SVN игнорируют «следующий коммит).
  • Ресхарверные каталоги.

Ряд этих больших файлов был «SVN удален», поскольку они были добавлены, создавая дальнейшую проблему идентификации самых больших преступников.

Я хочу либо:

  • Создайте новый репозиторий SVN, который содержит только код для всех программных проектов - это Действительно важно Что скопированные файлы поддерживают свою историю SVN из старого репозитория.
  • Удалите большие двоичные коммиты и файлы из существующего репозитория.

Есть ли кто из них возможны?

Это было полезно?

Решение

Вам придется использовать Свальма С.В.Надмин Чтобы получить файл дампа вашего текущего хранилища и, возможно, svndumpfilter. обработать файл дампа. Вы также можете вручную изменять DumpFile до тех пор, пока вы осторожны.

Вероятно, не будет быстрой и легкой работой, но это можно сделать. Я сделал что-то подобное, только на гораздо меньший репозиторий. У меня было репо, причем около 150 ревизий, которые заняли около 600 МБ.

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

Другие советы

Другие правильно svnadmin dump, и т. Д. Что-то вроде этого приведет вас к пересмотру, которые добавили множество данных в ваш репо, и являются кандидатами для svndumpfilter:

for r in `svn log -q | grep ^r | cut -d ' ' -f 1 | tr -d r`; do
   echo "revision $r is " `svn diff -c $r | wc -c` " bytes";
done

Вы также можете попробовать что-то подобное, чтобы найти изменения, которые добавили файлы с определенным расширением (здесь, .jpg):

svn log -vq | egrep "^r|\.jpg$" | grep -B 1 "\.jpg$"

Если вы удалили файлы из репозитория, используя «SVN Delete», вы на самом деле не удалили файлы. Это будет красота SVN. Как только файл добавляется к репозиторию, это там вечно (если только сдач и нагрузка). После «удаления» файлов вы фактически создаете новый пересмотр, который отмечает удаление, но файлы продолжают существовать в предыдущих изменениях.

Я сделал немного свалки и нагрузки, но и гораздо больший репозиторий. Около 60 000 (!!!) ревизии. Потребовалось время, но в конце, после тщательной загрузки, репозиторий снова построен.

Ваш единственный способ состоит в том, чтобы перечислить изменения, которые были добавлены файлы, изменены и удалены. Затем сбросьте изменения между ними и загрузите их в правильном порядке. Будьте в курсе, нет места для ошибок. Если вы ошиблись, вам придется начать закончить. Дамп и загрузить с самого начала.

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

Удачи.

Если вам просто нужно найти оскорбительные коммиты а также У вас есть доступ к серверу, хостингом хранилища: ищите большие файлы в подкаталоге DB / REVS в репозитории (предполагая, что он использует формат FSFS).

Разве это не совсем другая проблема, с дополнительным шагом? Т.е. вам нужно найти файлы, которые вы считаете большим и двоичным, а затем проверьте, действительно ли они управляются SVN или были построены локально (или импортированы из системы Parallel Asset, если она уже на месте).

Итак, просто найдите файлы, затем сделайте svn info На них, чтобы узнать, если они являются частью хранилища.

Просто маленькая мысль, вы говорите, что текущее состояние репозитория (нынешняя голова) хорош, то есть крупные двоичные файлы были SVN Deleteed в прошлом. Поэтому ваша проблема является чисто размером репозитория?

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

Если вы поместите полный дамп на DVD, например, у вас будут доступны данные, если вы когда-нибудь нуждаетесь в этом, но вы могли бы удалить весь репозиторий и SVN загрузить дамп пересмотра, оставив вас с небольшим чистым репозитором.

Также возможно сбросить специфическую ревизию, а не только голову, поэтому, например, вы могли бы сохранить последние 3 месяца ревизий и выбросить все старше на DVD ....

Разработав ответ по чужему новому, вот что конкретно работал для меня:

svnadmin create new-repo
svnadmin dump old-repo | svndumpfilter exclude --pattern '*.exe' '*.jpg' '*.png' | svnadmin load new-repo

Вы можете исключить свой Obj а также Bin каталоги, добавляя их в svndumpfilter Команда - я не пробовал.

Кроме того, подтверждение fsfs-stats Программа (новая в Subversion 1.8, заменена в 1.9 svnfsfs stats) может быть полезен для количественного определения типов файлов и конкретных файлов, которые заполняют ваш репозиторий.

Это может быть полезно для сравнения репозиториев позже:

colordiff -u <(svn log -v file:///.../old-repo ) <(svn log -v file:///.../new-repo)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top