Это сообщение от Сам Линус может помочь вам с некоторыми другими ограничениями
[...] CVS, то есть он действительно в значительной степени ориентирован на "один файл"
за один раз "модель.
Что приятно, у вас может быть миллион файлов, а затем только проверка
некоторые из них - вы никогда даже не увидите влияние других
999,995 файлов.
Гит
принципиально никогда не смотрится меньше, чем весь репо. Даже если ты
немного ограничить вещи (например, проверить только часть, или история идет
немного назад), git заканчивает тем, что всегда заботится обо всем,
и нести знания вокруг.
Так что мерзавец действительно плохо масштабируется, если заставить его смотреть на все как на единое целое
огромный репозиторий. Я не думаю, что эта часть действительно исправима, хотя мы
может улучшить его.
И да, тогда есть проблемы с "большими файлами". Я действительно не знаю что
делать с огромными файлами. Мы сосем их, я знаю.
Подробнее см. В моем другом ответе : ограничение для Git состоит в том, что каждый репозиторий должен представлять собой " связный набор файлов ", сам по себе "вся система" ( не тег "часть репозитория").
Если ваша система состоит из автономных (но взаимозависимых) частей, вы должны использовать подмодулей .
Как показано ответом Talljoe , пределом может быть system one (большое количество файлов), но если вы действительно понимаете природу Git (о согласованности данных, представленной его ключи SHA-1), вы поймете, что истинный «предел» - это использование один: то есть вы не должны пытаться хранить все в репозитории Git, если вы не готовы чтобы всегда получить или пометить все обратно. Для некоторых крупных проектов это не имеет смысла.
Для более детального изучения ограничений git см. « git с большими файлами »
(в котором упоминается git-lfs : решение для хранения больших файлов вне git-репозитория. GitHub, апрель 2015 г.)
Три проблемы, ограничивающие git-репо:
- огромные файлы ( xdelta для packfile находится только в памяти, что плохо для больших файлов)
- огромное количество файлов , что означает, что один файл на BLOB-объект и медленный 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
может быть медленным, когда файл сильно изменяется.