В принципе, это сводится к компромиссам.
Один из ваших вопросов есть пример из самого Линуса:
[...] 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 с другим). В действительности, он обычно работает нормально, особенно если у вас достаточно памяти.
Это просто не работает, как и для того, для чего он предназначен.
Не путайте большие репозитории и хранилища, заполненные двоичными файлами. Если ваш репозиторий содержит * sources *, он вписывается в git. –
И я думаю, причина, по которой он не был «исправлен», заключается в том, что люди, которые могут «исправить», используют git как исходный репозиторий, а не как двоичные файлы или репозиторий данных. –
@dystroy, [большие текстовые файлы также являются проблемой] (https://stackoverflow.com/questions/7945846/versioning-large-text-files-in-git), я собираю –