Зменшити розмір сховища git


290

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

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

Будь-які пропозиції?


1
Я щойно це зробив, і це знизило його до 2,2 mb ... велике спасибі! Хоча це, здається, не зменшило розмір репо на Heroku..hmm
відправлено-hil

11
Натисніть на нього --force. Він перезаписує вміст, навіть якщо не було змін (жодних нових комісій тощо)
Marcin Gil

1
@MarcinGil - Внизу, VonC заявляє, що вам потрібен доступ до сервера, щоб очистити віддалений сервер (якщо я його правильно розбираю).
jww

1
Просто коментар, який допоможе іншим читачам, якщо вони не знають, що додати до програми .gitignore, на gitignore.io є приємний сервіс, який допоможе вам налаштувати товар .gitignoreна базі вашої середовищі розробників.
Blairg23

Відповіді:


352

git gc --aggressiveце один із способів змусити процес чорносливу пройти (щоб бути впевненим:) git gc --aggressive --prune=now. У вас є й інші команди для очищення репо. Не забувайте, однак, іноді git gcпоодинці можна збільшити розмір репо !

Він також може бути використаний після a filter-branch, щоб позначити деякі каталоги, які слід вилучити з історії (з подальшим збільшенням простору); дивіться тут . Але це означає, що ніхто не стягує з вашої публічної репо. filter-branchможе зберігати резервні копії в.git/refs/original , щоб і каталог можна було також очистити.

Нарешті, як згадується у цьому коментарі та цьому питанні ; чистка рефлогу може допомогти:

git reflog expire --all --expire=now
git gc --prune=now --aggressive

Ще більш повним і, можливо, небезпечним рішенням є видалення невикористаних об'єктів із сховища git


В іншому сценарії, см також stackoverflow.com/questions/1029969 / ...
VonC

1
Примітка для себе: не забудьте віддалені філії: stackoverflow.com/questions/11255802 / ...
VonC

1
Зауважте до себе: не забувайте віддалені теги
saiyancoder

1
Окрім віддалених посилань, рефлог - це ще одна річ, яка може спричинити збереження посилань, які ви намагаєтесь видалити. stackoverflow.com/q/27489761/1072626
vossad01

1
@jww Я підтверджую, що це суто локальна операція. Він не має відношення до розміру віддаленого репо. Вам потрібно буде прямий доступ до сервера віддаленого репо, щоб зробити те саме.
VonC

94

Дякуємо за ваші відповіді. Ось що я зробив:

git gc
git gc --aggressive
git prune

Це, здавалося, зробило трюк. Я почав з 10,5 МБ, і тепер це трохи більше 980 КБ.


8
pruneзавжди працює від gc(за замовчуванням 2 тижні тому).
Кас

117
Ви можете запустити всі 3 з чорносливом до цих пір, використовуючиgit gc --aggressive --prune=now
rahul286

1
Але коли я видаляю репо, то клоную її знову, розмір все ще великий. Як ви впораєтеся з цим?
cwtuan

2

У моєму випадку я натиснув кілька великих (> 100 Мб) файлів, а потім перейшов до їх видалення. Але вони все ще були в історії мого репо, тому мені довелося також видалити їх.

У чому полягає трюк:

bfg -b 100M  # To remove all blobs from history, whose size is superior to 100Mb
git reflog expire --expire=now --all
git gc --prune=now --aggressive

Потім вам потрібно натиснути на свою гілку:

git push origin <your_branch_name> --force

bfg - це інструмент, який можна встановити на Linux та macOS за допомогою brew:

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