Каковы ограничения файла в Git (количество и размер)?

175

Кто-нибудь знает, каковы ограничения Git по количеству файлов и размеру файлов?

Александр Радемакер
источник
В Windows максимальный размер файла составляет 4 ГБ (по состоянию на июль 2020 года) из-за ошибки: github.com/git-for-windows/git/issues/1063
cowlinator

Ответы:

161

Это сообщение от самого Линуса может помочь вам с некоторыми другими ограничениями

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

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

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

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

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

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

Как показано в ответе Talljoe , предел может быть системным (большое количество файлов), но если вы понимаете природу Git (о когерентности данных, представленной его ключами SHA-1), вы поймете истинный «предел» это использование один: то есть вы не должны пытаться хранить все в Git-репозитории, если вы не готовы всегда получать или помечать все обратно. Для некоторых крупных проектов это не имеет смысла.


Более подробное описание ограничений git см. В разделе « git с большими файлами »
(в котором упоминается git-lfs : решение для хранения больших файлов вне репозитория git. GitHub, апрель 2015)

Три проблемы, которые ограничивают git-репо:

  • огромные файлы ( xdelta для packfile находится только в памяти, что плохо для больших файлов)
  • огромное количество файлов , что означает, один файл на блоб, и медленный git gc для генерации по одному пакетному файлу за раз.
  • огромные файлы пакета , с индексом файла пакета, неэффективным для извлечения данных из (огромного) файла пакета.

Более поздняя ветка (февраль 2015 г.) иллюстрирует ограничивающие факторы для репозитория Git :

Будут ли несколько одновременных клонов с центрального сервера замедлять другие параллельные операции для других пользователей?

При клонировании сервер не блокируется, поэтому теоретически клонирование не влияет на другие операции. Хотя клонирование может использовать много памяти (и много процессора, если вы не включите функцию растрового изображения, что вам следует).

Будет git pullмедленным?

Если мы исключим серверную сторону, размер вашего дерева будет основным фактором , но ваши 25k-файлы должны быть хорошими (linux имеет 48k-файлы).

' git push'?

Это не зависит от того, насколько глубока история вашего репо или насколько широко ваше дерево, поэтому должно быть быстрым.

Ах, количество рефери может повлиять как на, так git-pushи на git-pull.
Я думаю, что Стефан знает лучше меня в этой области.

' git commit'? (Он указан как медленный в ссылке 3. ) ' git status'? (Снова медленно в ссылке 3, хотя я этого не вижу.)
(Также git-add)

Опять размер вашего дерева. При размере вашего репо, я не думаю, что вам нужно беспокоиться об этом.

Некоторые операции могут показаться не повседневными, но если они часто вызываются веб-интерфейсом в GitLab / Stash / GitHub и т. Д., То они могут стать узкими местами. (например git branch --contains, большое количество ветвей, кажется, очень плохо влияет на ' ')

git-blame может быть медленным, когда файл сильно изменяется.

VonC
источник
4
@ Thr4wn: см. Также stackoverflow.com/questions/1979167/git-submodule-update/… для получения дополнительной информации на странице субмодуля GitPro. Для более короткой версии: stackoverflow.com/questions/2065559/…
VonC
1
Обновлена ​​ссылка на документацию по git submoules = git-scm.com/book/en/Git-Tools-Submodules
JHowIX
Я действительно задаюсь вопросом, с таким большим количеством sqlite и множеством альтернатив баз данных, доступных в linux, почему они не могут просто использовать базу данных, которую легко создавать, копировать и масштабировать.
Акаш Кава
«git действительно плохо масштабируется, если вы заставляете его рассматривать все как один огромный репозиторий», что это говорит о масштабируемости monorepos?
ephemer
@ephemer Что говорит ... это цитата из 10 лет назад. С тех пор, в 2017 году, у Microsoft появился собственный монорепорт ( devblogs.microsoft.com/bharry/… 300GB +), а в 2019 году все еще ожидаются улучшения: stackoverflow.com/a/57129687/6309
VonC
36

Нет никаких реальных ограничений - все именуется 160-битным именем. Размер файла должен быть представлен в 64-битном числе, поэтому здесь нет никаких ограничений.

Однако есть практический предел. У меня есть репозиторий ~ 8 ГБ с> 880 000 файлов, и Git GC занимает некоторое время. Рабочее дерево довольно большое, поэтому операции, которые проверяют весь рабочий каталог, занимают довольно много времени. Этот репо используется только для хранения данных, так что это всего лишь набор автоматизированных инструментов, которые обрабатывают его. Извлечение изменений из репозитория намного, намного быстрее, чем повторная синхронизация тех же данных.

%find . -type f | wc -l
791887
%time git add .
git add .  6.48s user 13.53s system 55% cpu 36.121 total
%time git status
# On branch master
nothing to commit (working directory clean)
git status  0.00s user 0.01s system 0% cpu 47.169 total
%du -sh .
29G     .
%cd .git
%du -sh .
7.9G    .
Talljoe
источник
2
Хотя выше есть «более правильный» ответ, говорящий о теоретических ограничениях, этот ответ кажется мне более полезным, поскольку он позволяет сравнить собственную ситуацию с вашей. Спасибо.
Bananeweizen
1
Очень интересно. Как это возможно, что рабочая копия больше, чем .gitкаталог? Моим наивным предположением было то, что он .gitсодержит копию рабочего каталога и историю, поэтому он должен быть больше. Может кто-нибудь указать мне на понимание ресурса, как эти размеры связаны?
Bluenote10
1
@ bluenote10 Содержимое в .gitкаталоге сжато. Таким образом, репозиторий с относительно небольшим количеством коммитов может иметь меньшую сжатую историю, чем несжатый рабочий каталог. Мой опыт показывает, что на практике с кодом C ++ вся история обычно имеет такой же размер, как и рабочий каталог.
Прапин
28

Если вы добавляете файлы слишком большого размера (в моем случае это ГБ, Cygwin, XP, 3 ГБ ОЗУ), ожидайте этого.

фатальный: недостаточно памяти, malloc не удалось

Подробнее здесь

Обновление 3/2/11: видел подобное в Windows 7 x64 с помощью Tortoise Git. Используется тонны памяти, очень и очень медленный отклик системы.

Брайан Карлтон
источник
17

Еще в феврале 2012 года в списке рассылки Git была очень интересная тема от Джошуа Редстоуна, инженера-программиста Facebook, тестирующего Git в огромном тестовом репозитории:

Тестовое репо имеет 4 миллиона коммитов, линейную историю и около 1,3 миллиона файлов.

Проведенные тесты показывают, что для такого репо Git непригоден (холодная операция длится минуты), но это может измениться в будущем. В основном производительность ограничивается количеством stat()обращений к модулю FS ядра, поэтому она будет зависеть от количества файлов в репо и эффективности кэширования FS. Смотрите также этот Гист для дальнейшего обсуждения.

CharlesB
источник
2
+1 Интересно. Это перекликается с моими собственными ответами об ограничениях git, в которых подробно описываются ограничения на огромные файлы / количество файлов / упаковочных файлов.
VonC
2

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

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

Dustin
источник
1

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

Kzqai
источник
1

У меня есть большое количество данных, которые хранятся в моем репо как отдельные фрагменты JSON. В нескольких каталогах содержится около 75 000 файлов, и это не сильно ухудшает производительность.

Проверка их в первый раз была, очевидно, немного медленной.

funwhilelost
источник
1

Я обнаружил, что это пытается сохранить огромное количество файлов (350k +) в репо. Да, магазин. Смеётся.

$ time git add . 
git add . 333.67s user 244.26s system 14% cpu 1:06:48.63 total

Следующие выдержки из документации Bitbucket довольно интересны.

Когда вы работаете с клонированием и проталкиванием репозитория DVCS, вы работаете со всем репозиторием и всей его историей. На практике, когда ваш репозиторий становится больше 500 МБ, вы можете начать видеть проблемы.

... 94% клиентов Bitbucket имеют репозитории менее 500 МБ. Ядро Linux и Android имеют размер менее 900 МБ.

Рекомендуемое решение на этой странице - разделить ваш проект на более мелкие куски.

Kasisnu
источник
Я думаю, что это довольно устарело. В данный момент на сайте, на который вы ссылаетесь, ничего не говорится о репозитории android (или linux). Но мне интересно, не было ли это неточно даже тогда? Например, сравните этот ответ . Может они имели в виду что-то еще?
jjj