Які обмеження файлів у Git (кількість та розмір)?


Відповіді:


161

Це повідомлення від самого Лінуса може допомогти вам в деяких інших обмеженнях

[...] CVS, тобто він дійсно в основному орієнтується на модель "один файл за часом".

Що приємно тим, що ви можете мати мільйон файлів, а потім перевірити лише деякі з них - ви ніколи навіть не побачите вплив інших 999,995 файлів.

Git принципово ніколи насправді не виглядає менше, ніж цілий репо. Навіть якщо ви трохи обмежите речі (наприклад, перевірте лише частину, або історія повернеться трохи назад), git закінчується як і раніше завжди піклуючись про все, і несе знання навколо.

Тож git масштабує дуже погано, якщо ви змусите його дивитися на все як на одне величезне сховище. Я не думаю, що ця частина справді виправлена, хоча ми, можливо, можемо її покращити.

І так, тоді виникають проблеми "великого файлу". Я дійсно не знаю, що робити з величезними файлами. Ми їх смокчемо, я знаю.

Детальніше дивіться в іншій моїй відповіді : обмеження Git полягає в тому, що кожне сховище повинне представляти " когерентний набір файлів ", "всю систему" саме по собі (не можна тегувати "частиною сховища").
Якщо ваша система складається з автономних (але взаємозалежних) частин, ви повинні використовувати підмодулі .

Як показано у відповіді Талджо , обмеженням може бути системний один (велика кількість файлів), але якщо ви зрозумієте природу Git (про когерентність даних, представлену її ключами SHA-1), ви зрозумієте справжній "ліміт" це використання, тобто ви не повинні намагатися зберігати все у сховищі Git, якщо тільки ви не готові завжди отримувати або тегувати все назад. Для деяких великих проектів це не мало б сенсу.


Для більш глибокого перегляду меж git див. " Git з великими файлами "
(де згадується git-lfs : рішення для зберігання великих файлів поза git repo. GitHub, квітень 2015)

Три питання, які обмежують git repo:

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

Більш свіжа тема (лютий 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 може бути повільним, коли файл багато змінюється.


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

Мені справді цікаво, оскільки в Linux існує стільки альтернатив sqlite та багато альтернативних баз даних, чому вони не можуть просто використовувати базу даних, яку легко створити для резервного копіювання, копіювання та масштабування.
Акаш Кава

"масштабування git дійсно погано, якщо ви змусите його дивитися на все як на одне величезне сховище", що це говорить про масштабованість монорепортажів?
ефемер

@ephemer Що кажуть - це цитування від 10 років тому. З тих пір, в 2017 році, Microsoft має свій власний monorepo ( devblogs.microsoft.com/bharry / ... : 300GB +) і поліпшення все ще майбутнє в 2019 році: stackoverflow.com/a/57129687/6309
VonC

36

Реального обмеження немає - все названо 160-бітовим іменем. Розмір файлу повинен бути представленим у 64-бітовому номері, щоб не було і реального обмеження.

Однак є практична межа. У мене є сховище розміром ~ 8 ГБ з> 880 000 файлами, а git gc займає деякий час. Робоче дерево досить велике, тому операції, які оглядають весь робочий каталог, займають досить багато часу. Однак ця репо використовується лише для зберігання даних, тому це лише купа автоматизованих інструментів, які обробляють її. Витягнення змін із РЕПО набагато, набагато швидше, ніж yсинхронізація одних і тих же даних.

%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    .

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. Дивіться також цей історію для подальшого обговорення.


2
+1 Цікаво. Це повторює мої власні відповіді про обмеження git із деталізацією обмежень на величезні файли / кількість файлів / packfiles.
VonC


2

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

Однак насправді обмежень для моделі не існує. Ви, звичайно, можете його погано використовувати і бути жалюгідним.


1

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


1

У мене є велика кількість даних, які зберігаються в моєму репо як окремі фрагменти JSON. У кількох каталогах знаходиться близько 75 000 файлів, і це не дуже шкодить продуктивності.

Перевірка їх у перший раз була, очевидно, трохи повільною.


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 Kernel, і Android мають менше 900 МБ.

Рекомендоване рішення на цій сторінці - розділити ваш проект на менші шматки.


Я думаю, це досить застаріло. Зараз, здається, немає нічого про Android-репортаж (ні Linux) на сайті, на який ви посилаєтесь. Але мені цікаво, чи це тоді не було неточним? Наприклад, порівняйте цю відповідь . Може вони мали на увазі щось інше?
jjj

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.