українська мова ▾ Topics ▾ Latest version ▾ git-gc last updated in 2.52.0

НАЗВА

git-gc — Очищення від непотрібних файлів та оптимізація локального репозиторію

СИНОПСИС

git gc [--aggressive] [--auto] [--[no-]detach] [--quiet] [--prune=<date> | --no-prune] [--force] [--keep-largest-pack]

ОПИС

Виконує низку завдань з обслуговування в поточному репозиторії, таких як стиснення версій файлів (для зменшення місця на диску та підвищення продуктивності), видалення недоступних обʼєктів, які могли бути створені в результаті попередніх викликів git add, пакування посилань, обрізання журналу посилань (reflog), видалення метаданих rerere або застарілих робочих дерев. Також може оновлювати допоміжні індекси, такі як commit-graph.

Під час виконання типових операцій з Porcelain, що створюють об’єкти, система перевіряє, чи значно збільшився розмір репозиторію з моменту останнього обслуговування, і, якщо так, автоматично запускає команду git gc. Щоб дізнатися, як вимкнути цю функцію, див. розділ gc.auto нижче.

Виконання команди git gc вручну може знадобитися лише у випадках, коли об’єкти додаються до репозиторію без регулярного виконання таких допоміжних команд, для одноразової оптимізації репозиторію або, наприклад, для виправлення наслідків неідеального масового імпорту. Детальнішу інформацію щодо імпорту див. у розділі «ОПТИМІЗАЦІЯ PACKFILE» на сторінці git-fast-import[1].

ОПЦІЇ

--aggressive

Зазвичай git gc працює дуже швидко, забезпечуючи хороше використання дискового простору та продуктивність. Ця опція призведе до того, що git gc буде більш агресивно оптимізувати репозиторій, але це займе набагато більше часу. Ефекти такої оптимізації здебільшого є постійними. Дивіться розділ «АГРЕСИВНА ОПТИМІЗАЦІЯ» нижче для отримання детальної інформації.

--auto

З цією опцією git gc перевіряє, чи потрібне якесь технічне обслуговування; якщо ні, то завершується без виконання жодної роботи.

Дивіться параметр gc.auto у розділі "КОНФІГУРАЦІЯ" нижче, щоб дізнатися, як працює ця евристика.

Після того, як перевищення лімітів параметрів конфігурації, таких як gc.auto та gc.autoPackLimit, запустить обробку даних, усі інші завдання обробки даних (наприклад, відновлення, робота з деревами, reflog…​) також будуть виконані.

--detach
--no-detach

Запускати у фоновому режимі, якщо система це підтримує. Цей параметр замінює конфігурацію gc.autoDetach.

--cruft
--no-cruft

Під час видалення недоступних об’єктів слід упаковувати їх окремо в пакунок «cruft», а не зберігати як окремі об’єкти. Параметр --cruft є стандартно увімкненим .

--max-cruft-size=<n>

Під час пакування недоступних об’єктів у пакунок cruft обмежте розмір нових пакунків cruft максимум до <n> байтів. Це значення має пріоритет над будь-яким значенням, вказаним у параметрі конфігурації gc.maxCruftSize. Докладнішу інформацію див. в описі параметра --max-cruft-size команди git-repack[1].

--expire-to=<dir>

Під час пакування недоступних об’єктів у пакунок cruft записати пакунок cruft, що містить об’єкти, які підлягають видаленню (якщо такі є), у теку <dir>. Ця опція діє лише у поєднанні з опцією --cruft. Докладнішу інформацію див. в описі опції --expire-to у документації git-repack[1].

--prune=<date>

Видаляє незакріплені об’єкти, термін дії яких минув (зазвичай це 2 тижні тому, але це значення можна змінити за допомогою змінної конфігурації gc.pruneExpire). Параметр --prune=now видаляє незакріплені об’єкти незалежно від їхнього терміну дії, що підвищує ризик пошкодження даних, якщо інший процес одночасно записує дані до репозиторію; див. розділ «ПРИМІТКИ» нижче. Параметр --prune є стандартно увімкненим.

--no-prune

Не вилучати будь-які незакріплені обʼєкти.

--quiet

Приховати всі звіти про хід виконання.

--force

Примусово запускати git gc, навіть якщо на цьому репозиторії може бути запущено інший екземпляр git gc.

--keep-largest-pack

Усі пакунки, крім найбільшого (не cruft) пакунка, будь-які пакунки, позначені файлом .keep, та будь-які cruft-пакунки обʼєднуються в один пакунок. Коли використовується ця опція, gc.bigPackThreshold ігнорується.

АГРЕСИВНА ОПТИМІЗАЦІЯ

Коли вказано опцію --aggressive, git-repack[1] буде викликано з прапорцем -f, який, своєю чергою, передасть --no-reuse-delta до git-pack-objects[1]. Це призведе до видалення будь-яких наявних дельт та їх переобчислення, що призведе до значно більших витрат часу на перепакування.

Наслідки цього здебільшого стійкі, наприклад, коли пакунки та незакріплені обʼєкти обʼєднуються в один пакунок, наявні дельти в цьому пакунку можуть бути використані повторно, але також є різні випадки, коли ми можемо вибрати неоптимальну дельту з новішого пакунку.

Крім того, надання параметра --aggressive змінить опції --depth та --window, що передаються до git-repack[1]. Дивіться налаштування gc.aggressiveDepth та gc.aggressiveWindow нижче. Використовуючи більший розмір вікна, ми з більшою ймовірністю знайдемо оптимальніші дельти.

Ймовірно, не варто використовувати цю опцію для певного репозиторію без проведення індивідуальних тестів продуктивності. Це займає набагато більше часу, а отримана оптимізація простору/дельти може бути виправданою, а може й ні. Відмова від використання цієї опції взагалі є правильним компромісом для більшості користувачів та їхніх репозиторіїв.

КОНФІГУРАЦІЯ

Все, що знаходиться нижче цього рядка в цьому розділі, вибірково включено з документації git-config[1]. Вміст такий самий, як і там:

Warning

Missing uk/config/gc.adoc

See original version for this content.

ПРИМІТКИ

Команда git gc намагається не видаляти об’єкти, на які є посилання в будь-якій частині вашого репозиторію. Зокрема, вона збереже не тільки об’єкти, на які посилаються ваші поточні гілки та теги, а й об’єкти, на які посилаються індекс, гілки віддаленого відстеження, reflogs (які можуть посилатися на коміти в гілках, що пізніше були змінені або відкочені), а також будь-що інше в просторі імен refs/* Зверніть увагу, що примітка (такого типу, що створюється командою git notes), прикріплена до обʼєкта, не сприяє збереженню обʼєкта. Якщо ви очікуєте, що деякі обʼєкти будуть видалені, а вони не видаляються, перевірте всі ці місця та вирішіть, чи є сенс у вашому випадку для видалення цих посилань.

З іншого боку, коли git gc виконується одночасно з іншим процесом, існує ризик видалення обʼєкта, який інший процес використовує, але не створив посилання на нього. Це може призвести до збою іншого процесу або пошкодження репозиторію, якщо інший процес пізніше додасть посилання на видалений обʼєкт. Git має дві функції, які значно помʼякшують цю проблему:

  1. Будь-який обʼєкт з часом модифікації новішим за дату --prune зберігається разом з усім, що доступно з нього.

  2. Більшість операцій, які додають обʼєкт до бази даних, оновлюють час модифікації обʼєкта, якщо він вже присутній, тому застосовується пункт №1.

Однак ці функції не є повноцінним рішенням, тому користувачі, які одночасно виконують команди, повинні жити з певним ризиком пошкодження (який на практиці здається низьким).

ГАЧКИ

Команда git gc --auto запустить гачок pre-auto-gc. Див. githooks[5] для отримання додаткової інформації.

GIT

Частина набору git[1]