2015-04-01 2 views
6

Десятки вопросов и ответов на SO и в других местах подчеркивают, что Git не может обрабатывать большие файлы или большие репозитории. Предлагается несколько обходных решений, таких как git-fat и git-annex, но в идеале Git обрабатывает большие файлы/репозиции изначально.Почему Git не может обрабатывать большие файлы и большие репозитории?

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

Много связанных с этим вопросов, но никто, кажется, объяснить почему это такое большое препятствие:

+1

Не путайте большие репозитории и хранилища, заполненные двоичными файлами. Если ваш репозиторий содержит * sources *, он вписывается в git. –

+0

И я думаю, причина, по которой он не был «исправлен», заключается в том, что люди, которые могут «исправить», используют git как исходный репозиторий, а не как двоичные файлы или репозиторий данных. –

+0

@dystroy, [большие текстовые файлы также являются проблемой] (https://stackoverflow.com/questions/7945846/versioning-large-text-files-in-git), я собираю –

ответ

9

В принципе, это сводится к компромиссам.

Один из ваших вопросов есть пример из самого Линуса:

[...] CVS, то есть он действительно заканчивается время довольно сильно ориентирован на «один файл за раз» модель.

Что приятно в том, что у вас может быть миллион файлов, а затем проверить только некоторые из них - вы даже не увидите влияния других 999,995 файлов.

Git принципиально никогда не смотрит на меньшее, чем все репо. Даже если вы немного ограничиваете (то есть проверяете только часть, или история возвращается немного), git заканчивается тем, что всегда заботится обо всем этом, и неся знания вокруг.

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

И да, тогда есть проблемы с «большим файлом». Я действительно не знаю, что делать с огромными файлами. Я знаю, что сосать их.

Как вы не найдете структуру данных с доступом и вставкой O (1), вы не найдете контент-трекер, который сделает все фантастически.

Git сознательно выбрал, чтобы быть лучше в некоторых вещах, в ущерб другим.


Использование диска

Поскольку Git является DVCS (Распределенная система управления версиями), каждый имеет копию всего репозитория (если вы не используете относительно недавний мелкий клон).

У этого есть действительно хорошие преимущества, поэтому DVCS, такие как Git, стали безумно популярными.

Однако репозиторий с 4 ТБ на центральном сервере с SVN или CVS управляем, тогда как если вы используете Git, все не будут в восторге от того, что несут это.

В Git есть отличные механизмы для минимизации размера вашего репо путем создания цепочек дельта («diffs») между файлами. Git не ограничивается путями или фиксирует заказы при их создании, и они действительно работают очень хорошо ... вроде как gzipping всего репо.

Git помещает все эти небольшие различия в packfiles. Цепочки Delta и packfiles заставляют извлекать объекты на некоторое время, но это очень эффективно для минимизации использования диска. (Повторяются эти компромиссы.)

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


История

При заселении в файле, вы его во веки веков. Ваши внуки внуков внуков будут загружать вашу кошку gif каждый раз, когда они клонируют ваше репо.

Это, конечно, не уникально для git, поскольку DCVS делает последствия более значительными.

И хотя можно удалить файлы, дизайн контента на основе git (каждый идентификатор объекта является SHA его содержимого) делает удаление этих файлов сложным, инвазивным и разрушительным для истории. В отличие от этого, я могу удалить крутой двоичный файл из репозитория артефакта или ведра S3, не затрагивая остальную часть моего контента.


Сложность

Работа с очень большими файлами требует много тщательной работы, чтобы убедиться, что вы уменьшаете свои операции, и никогда не загружать все это в памяти. Это чрезвычайно сложно сделать надежно при создании программы с такой сложной функцией, как git.


Заключение

В конце концов, разработчики, которые говорят, что «не ставят большие файлы в Git» немного, как те, кто говорит, что «не ставить большие файлы в базах данных». Им это не нравится, но любые альтернативы имеют недостатки (Git intergration в одном случае, соответствие ACID и FKs с другим). В действительности, он обычно работает нормально, особенно если у вас достаточно памяти.

Это просто не работает, как и для того, для чего он предназначен.

0

Это потому, что каждый имеет контроль каждой версии каждого файла.

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

2

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

Альтернативы и дополнения, как ГИТ-приложение магазина пересмотры больших двоичных файлов по отдельности, таким образом, что нарушает обычное предположение Git и иметь каждый предыдущее состояние хранилища доступны в автономном режиме в любое время, но избегает необходимости отправляйте такие большие объемы данных.

Смежные вопросы