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

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

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

  • Полные установщики для многих сторонних инструментов.
  • .jpg и .png файлы (которые являются неизмененным экспортом PSDs, которые живут в той же папке).
  • Папки Bin и Obj (которые являются затем 'svn проигнорированы' следующая фиксация).
  • Каталоги Resharper.

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

Я хочу также:

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

Действительно ли любой из них возможен?

14
задан bahrep 16 November 2018 в 13:45
поделиться

5 ответов

Может быть, может и нет.

  • Тот же план, скорее всего, будет сгенерирован
  • ВНУТРЕННЕЕ СОЕДИНЕНИЕ может потребовать, чтобы DISTINCT получил тот же выход
  • EXISTS имеет дело с NULL
-121-102â1-

Правильный ответ:

p.communicate(b"insert into egg values ('egg');");

Обратите внимание на ведущий b, говоря, что это последовательность байтов, а не последовательность символов Юникод. Кроме того, если вы читаете это из файла:

value = open('thefile', 'rt').read()
p.communicate(value);

Измените это на:

value = open('thefile', 'rb').read()
p.communicate(value);

Снова обратите внимание на 'b'. Теперь, если значение является последовательностью, получаемым от API, который возвращает только последовательности независимо от того, что, , то необходимо его кодировать.

p.communicate(value.encode('latin-1');

Latin-1, поскольку в отличие от ASCII поддерживает все 256 байт. Но при этом наличие двоичных данных в Юникоде требует неприятностей. Лучше сделать его двоичным с самого начала.

-121--3126664-

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

Это, вероятно, не будет быстрой и легкой работой, но это может быть сделано. Я сделал нечто подобное, только для гораздо меньшего хранилища. У меня было репо с примерно 150 редакциями, которые заняли около 600MB.

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

4
ответ дан 1 December 2019 в 14:21
поделиться

Другие правильно в 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$"
8
ответ дан 1 December 2019 в 14:21
поделиться

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

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

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

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

Удачи.

1
ответ дан 1 December 2019 в 14:21
поделиться

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

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

0
ответ дан 1 December 2019 в 14:21
поделиться

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

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

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

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

0
ответ дан 1 December 2019 в 14:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: