Як скоротити папку .git


134

Моя поточна база має загальний розмір приблизно 200 Мб.

Але моя папка .git має дивовижний розмір 5 Гб (!). Оскільки я підштовхую свою роботу до зовнішнього сервера, мені не потрібна велика локальна історія ...

Як я можу скоротити папку .git, щоб звільнити місце на своєму ноутбуку? Чи можу я видалити всі зміни, які є старшими за 30 днів?

велике спасибі за будь-яку допомогу :)


2
Чи можете ви розмістити вихід git count-objects -v?
CB Bailey

2
Можливий дублікат зменшення розміру сховища git
sds

Відповіді:


113

не слід видаляти всі зміни старші 30 днів (я думаю, це якось можливо використовувати git, але насправді не рекомендується).

Ви можете зателефонувати git gc --aggressive --prune, який виконуватиме збір сміття у вашому сховищі та обріже старі об’єкти. чи багато у вас двійкових файлів (архівів, зображень, виконуваних файлів), які часто змінюються? вони зазвичай призводять до величезних папок .git (пам'ятайте, що git зберігає знімки для кожної редакції, а двійкові файли погано стискаються)


32
Власне, git gc --aggressiveце вважається поганою практикою. Краще використовувати git repack -a -d --depth=250 --window=250.
Артефакт2

18
@knittl: абсолютно. Ось повідомлення самого Лінуса: gcc.gnu.org/ml/gcc/2007-12/msg00165.html
Artefact2

3
@ artefact2: дякую за посилання! Я читав це, і Лінус вказує, що - агресивне не повторно використовувати (хороші) дельти - яких, здається, у цьому питанні не існує, оскільки сховище величезне. Шлях переупакування дійсно зайнятиме набагато більше часу. git gc --aggressiveперезавантаження дзвінків з розміром вікна 250 (пор. manpage) та глибиною 250 (пор. вихідний код). --aggressive додатково додає -fперемикач, щоб викинути та повторити всі попередні операції дельти (як також згадувалось у посиланні)
knittl

1
Я щойно перевірив репортаж hg.nginx.org/nginx (RELEASE-1.4.0 - підказка) за допомогою git-remote-hg, і це дало репост близько 100 Мб. Використання git gc --aggressive --pruneзводило це до 19 Мб.
Лекенштейн

15
@ Artefact2 Ваше повідомлення застаріле : зауважте, скільки років цій публікації. Насправді, в той самий день, коли він був розміщений, дискусія у списку розсилки призвела до цього зобов'язання: [..] Отже, параметри упаковки однакові в ці дні для будь-якого методу. . --pruneтакож не є необхідним, оскільки він став за замовчуванням з тих пір v1.5.5-rc0(зобов'язання 25ee973 , березень 2008 р.).
Лекенштейн

68

Ось що повинен сказати творець git Лінуса про те, як зменшити своє git repo:

Еквівалент "git gc - агресивний" - але зроблено * належним чином * - це робити (за ніч) щось на кшталт

   git repack -a -d --depth=250 --window=250

де ця глибина полягає лише в тому, наскільки глибокими можуть бути ланцюги дельти (зробіть їх довшими для старої історії - це коштує місця над головою), а річ у вікні - про те, наскільки велике вікно об'єкта ми хочемо сканувати кожному кандидату дельти.

І тут, можливо, ви хочете додати прапор "-f" (це "скинути всі старі дельти", оскільки ви зараз насправді намагаєтеся переконатися, що цей справді знаходить хороших кандидатів).

джерело: http://gcc.gnu.org/ml/gcc/2007-12/msg00165.html

Чи позбудуться цього бінарні дані, осиротілі в моїй репо? "git repack" не позбудеться зображень або бінарних даних, які ви зареєстрували у своїй репо-репортації, а потім видалили їх. Щоб назавжди видалити такі дані з репо, вам доведеться переписати свою історію. Поширений приклад - коли ви випадково перевіряєте свої паролі в git. Ви можете повернутися назад і видалити деякі файли, але тоді вам доведеться переписувати історію відтоді до цього, а потім примушувати натискати нове репо до свого походження.


Для мене папка .git становить близько 1,5G. Я спробував це, але у мене з’явилася помилка followng. fatal: Out of memory, malloc failed (tried to allocate 39763130 bytes)
Мирон

2
Після виконання repackлокального виконання , здійснення компресу та натискання, чи зменшення буде також віддаленим?
Тимо

@David Dehghan: Ей, я спробував це з каталогу проектів, але розмір папки .git не змінився. Це очікується чи мені потрібно натиснути, щоб побачити зміни? (вибачте, не дуже досвідчений з git.) У мене є зображення / gif в репо, і я здійснив кілька разів різні версії цього зображення, і я вважаю, що збільшив розмір .git.
giorgim

Привіт, на жаль, саме зараз ви очищаєте стару бінарну версію. Для цього вам потрібно переписати свою історію, яка насправді є складною. Ось декілька порад
Девід Деган

22

Я спробував їх, але моє сховище було все ще дуже великим. Проблема полягала в тому, що я випадково перевірив деякі створені великі файли. Після деяких пошуків я знайшов чудовий підручник, який спрощує видалення великих створених файлів. Цей підручник дозволив мені зменшити свій сховище з 60 Мб до <1 Мб.

Стів Лорек, як зменшити сховище Git


4
Ось архівована версія у випадку гниття посилання. Ця відповідь є / була корисною для репо, я наткнувся на те, де були скоєні файли .exe та .zip, які роздували розмір папки
.git

9

5 Гб проти 200 МБ - це щось дивно. Спробуйте бігтиgit gc .

Але ні, якщо ви не розділите свій сховище на модулі, ви не можете зменшити розмір .git каталогу.

Кожен клон git repo - це повноцінне сховище, яке може виконувати роль сервера. Ось базовий принцип управління розподіленими версіями.


3

Я використовую git більше як механізм синхронізації, ніж для історії версій. Тож моє рішення цієї проблеми полягало в тому, щоб переконатися, що всі мої поточні джерела знаходяться в задовільному стані, а потім просто видалити .git та повторно ініціалізувати репости. Проблема з дисковим простором вирішена. :-) Історія пішла :-( Я це роблю, оскільки репортаж знаходиться на невеликій USB-клавіші. Я не хочу і не потребую всієї своєї історії. Якби у мене був метод просто обрізання історії, я би використовував це.

Якби мені було цікаво зберегти свою історію, я б архівував поточний сховище. В якийсь момент пізніше я міг клонувати оригінальний сховище, скопіювати всі зміни з нового репо (припустимо, я не робив багато (жодного) перейменування чи видалення). А потім зробіть одну велику комісію, яка б представляла всі зміни, внесені в новому репо, як єдине зобов’язання у старому репо. Чи можливо об’єднати історії? Можливо, якщо я використовував гілку, а потім видаляв об'єкти, які мені не потрібні. (Я не знаю достатньо про внутрішні організації git, щоб почати так дурити).


1
Ви можете просто використовувати Dropbox для цього випадку використання. Я робив багато років.
Jonny

0

Перевірені вище методи, в моєму випадку нічого не працювало (де я випадково вбив процес git під час git push), тому мені нарешті довелося видалити репо і знову його клонувати, і тепер папка .git має нормальний розмір.


Мені довелося скористатися тим самим рішенням, оскільки мій диск був повний (папка .git> 90 ГБ), тому я не міг навіть запустити перепакування або git gc!
Fl4v
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.