Під час першого клонування сховища git спочатку отримує об'єкти (що досить очевидно), а потім витрачає приблизно стільки ж часу, "розв'язуючи дельти". Що насправді відбувається під час цієї фази клону?
Під час першого клонування сховища git спочатку отримує об'єкти (що досить очевидно), а потім витрачає приблизно стільки ж часу, "розв'язуючи дельти". Що насправді відбувається під час цієї фази клону?
Відповіді:
Git використовує кодування дельти для зберігання деяких об'єктів у пакетних файлах. Однак вам не хочеться відтворювати кожну зміну будь- якого файлу у певному файлі, щоб отримати поточну версію, тому Git також має періодичні знімки вмісту файлу, що зберігаються. "Вирішення дельти" - це крок, який стосується того, щоб все це залишалося послідовним.
Ось розділ із розділу "Git Internals" книги Pro Git, який доступний в Інтернеті, який розповідає про це.
git gc
або коли Git визначить це необхідним) Git буде стискати всі "вільні" файли в пакетний файл, щоб заощадити простір, і файл індексу в цьому пакетному файлі буде створено. Таким чином, zlib буде стискати з власним алгоритмом дельти, але Git використовує дельта-кодування для зберігання попередніх версій. Оскільки найпоширенішим та найчастішим доступом є остання версія, яка зберігається як знімок.
Етапи git clone
:
"Розв’язування дельти" - це повідомлення, показане для другого етапу, що індексує файл пакету ("git index-pack").
Пакетні файли не роблять мають в них власних ідентифікаторів об'єкта, лише вміст об'єкта. Таким чином, щоб визначити, що таке ідентифікатори об'єкта, git повинен зробити декомпресію + SHA1 кожного об'єкта в пакеті, щоб створити ідентифікатор об'єкта, який потім записується у файл індексу.
Об'єкт у пакувальному файлі може зберігатися як дельта, тобто послідовність змін, які вносяться до якогось іншого об'єкта. У цьому випадку git потребує отримання базового об'єкта, застосуйте команди та SHA1 результат. Сам базовий об'єкт, можливо, доведеться отримати, застосовуючи послідовність команд delta. (Незважаючи на те, що у випадку з клоном базовий об'єкт вже виникне, існує обмеження кількості виготовлених об'єктів, які зберігаються в пам'яті).
Підводячи підсумок, етап "розв'язання дельти" включає декомпресію та перевірку суми всієї бази даних РЕПО, що не дивно займає досить тривалий час. Імовірно, декомпресія та обчислення SHA1 насправді займає більше часу, ніж застосування команд delta.
У випадку наступного вилучення файл отриманого пакета може містити посилання (як бази об’єктів delta) на інші об'єкти, які, як очікується, вже мають. У цьому випадку приймаюча git фактично переписує отриманий файл пакету для включення будь-яких таких посилальних об'єктів, так що будь-який збережений файл пакету є самодостатнім. Можливо, саме звідси виникло повідомлення "розв'язання дельти".
Начебто Бурштин описує об'єктну модель, яку використовує Меркуріал або подібні. Git не зберігає дельти між наступними версіями об'єкта, а щоразу повні знімки об'єкта. Потім він стискає ці знімки за допомогою дельта-стиснення, намагаючись знайти хороші дельти для використання, незалежно від того, де в історії вони існують.