Як було сказано у цій відповіді ТА , git gc
дійсно можна збільшити розмір репо!
Дивіться також цю нитку
Тепер у git є механізм безпеки, щоб не видаляти нерозв'язані об'єкти відразу під час запуску ' git gc
'.
За замовчуванням необмежені об'єкти зберігаються протягом 2 тижнів. Це полегшить вам відновлення випадково видалених гілок або комітетів, або уникнути перегонів, коли щойно створений об’єкт у процесі існування, але ще не посилається на нього, може бути видалений git gc
процесом ' ', який працює паралельно.
Отже, щоб надати цей пільговий період упакованим, але невпорядкованим об'єктам, процес переупакування виштовхує ці нерозділені об'єкти з упаковки у свою пухку форму, щоб вони могли постаріти та врешті-решт підрізати.
Об'єктів, які стають нереференційними, як правило, не так вже й багато. Мати 404855 необмежених об'єктів - це досить багато, і надсилати ці об'єкти в першу чергу через клон - це нерозумно і повна втрата пропускної здатності мережі.
У будь-якому випадку ... Щоб вирішити свою проблему, вам просто потрібно запустити " git gc
" з --prune=now
аргументом, щоб вимкнути цей пільговий період та позбутися негайно цих невизначених об'єктів (безпечно лише в тому випадку, якщо в той же час не проводяться інші дії git, які повинні бути легким для забезпечення на робочому місці).
І BTW, використовуючи " git gc --aggressive
" з пізнішою версією git (або " git repack -a -f -d --window=250 --depth=250
")
Ця ж нитка згадує :
git config pack.deltaCacheSize 1
Це обмежує розмір кеша дельти одним байтом (фактично його вимикаючи) замість за замовчуванням 0, що означає необмежений. З цим я можу перепакувати це сховище за допомогою наведеної вище git repack
команди в системі x86-64 з 4 Гб оперативної пам’яті та використанням 4 потоків (це чотирьохядерний ядро). Однак споживання постійної пам'яті зростає майже до 3,3 ГБ.
Якщо ваша машина SMP і у вас недостатньо оперативної пам’яті, ви можете зменшити кількість потоків до однієї:
git config pack.threads 1
Крім того, ви можете додатково обмежити використання пам'яті --window-memory argument
значенням ' git repack
'.
Наприклад, використання --window-memory=128M
має підтримувати розумну верхню межу використання дельта-пошукової пам'яті, хоча це може призвести до менш оптимальної відповідності дельта, якщо репо містить багато великих файлів.
На передній частині гілки фільтра ви можете розглянути (з обережністю) цей сценарій
#!/bin/bash
set -o errexit
# Author: David Underhill
# Script to permanently delete files/folders from your git repository. To use
# it, cd to your repository's root and then run the script with a list of paths
# you want to delete, e.g., git-delete-history path1 path2
if [ $# -eq 0 ]; then
exit 0
fi
# make sure we're at the root of git repo
if [ ! -d .git ]; then
echo "Error: must run this script from the root of a git repository"
exit 1
fi
# remove all paths passed as arguments from the history of the repo
files=$@
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $files" HEAD
# remove the temporary history git-filter-branch otherwise leaves behind for a long time
rm -rf .git/refs/original/ && git reflog expire --all && git gc --aggressive --prune