Подтвердить что ты не робот

Версии больших текстовых файлов в git

Я использовал git для управления версиями, и мне это очень нравится. Поэтому я начал исследовать с помощью git для хранения большого количества больших двоичных файлов, которые я нахожу просто не чашкой чая git. Итак, как насчет больших текстовых файлов? Похоже, что git должен обрабатывать их просто отлично, но у меня также проблемы с этим.

Я тестирую это, используя текстовый файл стиля mbox размером 550 МБ. я git init сделал новый репо, чтобы сделать это. Вот мои результаты:

  • git add и git commit - общий размер репо 306mb - репо содержит один объект размером 306 МБ
  • добавить одно письмо в файл почтового ящика и git commit - общий размер репо - 611mb - репо содержит два объекта размером 306 МБ
  • добавить еще одно письмо в файл почтового ящика и git commit - общий размер репо - 917mb - репо содержит три объекта размером 306 МБ

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

  • git repack -adf - общий размер репо - 877mb - repo содержит один файл пакета размером 876 МБ.
  • git gc --aggressive - общий размер репо - 877mb - репо содержит один файл пакета размером 876 МБ.

Я ожидаю, что смогу получить репо в размере около 306 МБ, но я не могу понять, как это сделать. Все, что больше похоже, похоже на то, что хранится много дублирующихся данных.

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

Любые советы о том, как сохранить размер репо от взрыва при вставке небольшого количества текста в конец очень большого текстового файла?

Я просмотрел bup и git приложение, но мне бы очень хотелось придерживаться простого старого git если возможно.

Благодарим за помощь!

4b9b3361

Ответ 1

Я не думаю, что git отлично справится с хранением дельт в целом, и даже если вы сможете его окупить, это не будет детерминированным. Тем не менее, на основе http://metalinguist.wordpress.com/2007/12/06/the-woes-of-git-gc-aggressive-and-how-git-deltas-work/ вы можете попробовать git repack -a -d --depth=250 --window=250.

Я подозреваю, что ваш лучший вариант - обрезать свою историю с помощью git --rebase и хранить только последние несколько резервных копий. Вы можете сделать это с помощью ветвей git. Создайте ветвь, называемую ежегодно, ежемесячно и ежедневно. Каждый день совершайте фиксацию ежедневно, затем используйте git rebase --onto HEAD~4 HEAD~3 daily для удаления резервных копий старше 3 дней. В первый день недели каждую неделю еженедельно проверяйте и git cherry-pick daily, затем выполняйте ту же перезагрузку git, чтобы удалить еженедельные резервные копии старше 3 недель. Наконец, в первый день каждого года, следуйте аналогичному процессу. Вы, вероятно, захотите сделать git gc после этой последовательности каждый раз, чтобы освободить прежнее пространство.

Но если вы это делаете, вы больше не пользуетесь git и злоупотребляете тем, как это работает. Я думаю, что лучшее решение для резервного копирования для вас не включает git.

Ответ 2

Git не самый большой инструмент резервного копирования, но он должен иметь возможность эффективно обрабатывать добавление к текстовому файлу. Я с подозрением относился к вашим результатам. Я повторил ваш эксперимент с файлом размером 354 мегабайта и git 1.7.7 на OS X. Здесь мои действия и размер .git.

  • Git init (52K)
  • Git добавить mbox && & git commit (110M)
  • cat mail1 → mbox && & git commit -a -m (219M)
  • Git gc (95M)
  • cat mail2 → mbox && & git commit -a -m (204M)
  • Git gc (95M)

Как видите, git очень эффективен. 94 мегабайта - это размер сжатого mbox. Он не может быть намного меньше.

Я предполагаю, что вы либо используете старую версию git, либо ваш файл mbox сжимается или шифруется вашей почтовой программой.

  • Убедитесь, что содержимое вашего mbox, которое видит git, является простым текстом.
  • Если вы не используете последний git, обновите и повторите попытку.

Ответ 3

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

Используйте соответствующий инструмент резервного копирования, который также сохранит ваше дисковое пространство. Что-то вроде ZFS для резервных копий стоит попробовать: https://svn.oss.prd/repos/SHAW/BuildAndReleaseTransition/TeamCity/TeamCityConfiguration-39/TeamCityConfiguration.docx

Ответ 4

Одним из побочных эффектов больших файлов является то, что git diff может закончиться нехваткой памяти.

Хотя Git не является правильным инструментом (как упоминалось в других ответах), по крайней мере проблема git diff устраняется в Git 2.2.0 (Q4 2014).
См. зафиксировать 6bf3b81 из Nguyễn Thái Ngọc Duy (pclouds):

diff --stat: отметьте любой файл размером более core.bigfilethreshold двоичный

Слишком большие файлы могут привести к сбою в распределении памяти.
Если это произойдет здесь, это может повлиять на несколько команд, которые связаны с diff.
Более того, слишком большие файлы неэффективны для сравнения в любом случае (и, скорее всего, нетекстового), поэтому отметьте их двоичными и пропустите, глядя на их содержимое.