Зменшити розмір сховища 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.