Как сжать папку .git

134

Моя текущая база имеет общий размер ок. 200MB.

Но моя папка .git имеет потрясающий размер - 5 ГБ (!). Поскольку я отправляю свою работу на внешний сервер, мне не нужна большая локальная история ...

Как уменьшить размер папки .git, чтобы освободить место на моем ноутбуке? Могу ли я удалить все изменения старше 30 дней?

большое спасибо за любую помощь :)

JMW
источник
2
Можете ли вы опубликовать вывод git count-objects -v?
CB Bailey
2
Возможный дубликат Уменьшить размер репозитория git
sds

Ответы:

113

вы не должны удалять все изменения старше 30 дней (я думаю, что это как-то возможно с использованием git, но на самом деле не рекомендуется).

вы можете вызвать git gc --aggressive --prune, который выполнит сборку мусора в вашем репозитории и удалит старые объекты. у вас много бинарных файлов (архивов, изображений, исполняемых файлов), которые часто меняются? они обычно приводят к огромным папкам .git (помните, git хранит снимки для каждой ревизии, а двоичные файлы плохо сжимаются)

knittl
источник
32
На самом деле git gc --aggressiveэто считается плохой практикой. Лучше использовать git repack -a -d --depth=250 --window=250.
Artefact2
18
@knittl: абсолютно. Вот сообщение самого Линуса: gcc.gnu.org/ml/gcc/2007-12/msg00165.html
Artefact2
3
@ artefact2: спасибо за ссылку! Я прочитал это, и Линус указывает, что --aggressive не будет повторно использовать (хорошие) дельты - которые, похоже, не существуют в этом вопросе, потому что репозиторий огромен. на самом деле переупаковка займет намного больше времени. git gc --aggressiveвызывает repack с размером окна 250 (см. man-страницу) и глубиной 250 (см. исходный код). --aggressive дополнительно добавляет -fпереключатель, чтобы отбросить и повторить все предыдущие операции дельты (как также упоминалось в ссылке)
knittl
1
Я только что проверил репо hg.nginx.org/nginx (RELEASE-1.4.0 - подсказка) с помощью git-remote-hg, и это дало репо размером около 100 МБ. Использование git gc --aggressive --pruneуменьшило это до 19 МБ.
Lekensteyn
15
@ Artefact2 Ваше утверждение устарело : обратите внимание, сколько лет этому посту. Фактически, в тот же день, когда он был опубликован, обсуждение списка рассылки привело к следующему коммиту: [..] Таким образом, параметры упаковки в наши дни одинаковы для любого метода. , --pruneтакже не является необходимым, поскольку он стал значением по умолчанию с v1.5.5-rc0(commit 25ee973 , март 2008 г.).
Lekensteyn
68

Вот что говорит создатель git Линус о том, как уменьшить размер репозитория git:

Эквивалент "git gc --aggressive" - ​​но выполненный * правильно * - это сделать (за ночь) что-то вроде

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

где эта глубина касается как раз того, насколько глубокими могут быть дельта-цепочки (сделать их длиннее для старой истории - это стоит накладных расходов на пространство), а проблема окна - в том, насколько большое окно объекта мы хотим, чтобы каждый дельта-кандидат сканировал.

И здесь вы вполне можете добавить флаг «-f» (который означает «отбросить все старые дельты», так как сейчас вы на самом деле пытаетесь убедиться, что он действительно находит хороших кандидатов.

источник: http://gcc.gnu.org/ml/gcc/2007-12/msg00165.html

Избавится ли это от потерянных двоичных данных в моем репо? "git repack" не будет избавляться от изображений или двоичных данных, которые вы зарегистрировали в своем репозитории, а затем удалили. Чтобы навсегда удалить такие данные из репо, вам нужно переписать свою историю. Типичным примером этого является случай, когда вы случайно проверяете свои пароли в git. Вы можете вернуться и удалить некоторые файлы, но тогда вам придется переписать свою историю с того момента до настоящего момента, а затем принудительно отправить новое репо в свое происхождение.

Дэвид Дехган
источник
Для меня папка .git составляет около 1,5 ГБ. Я пробовал это, но у меня возникла ошибка. fatal: Out of memory, malloc failed (tried to allocate 39763130 bytes)
Miron
2
После repackлокального выполнения , выполнения фиксации и нажатия, будет ли сжатие также удалено?
Timo
@ Дэвид Дехган: Эй, я пробовал это из каталога проекта, но размер папки .git не изменился. Ожидается ли это, или мне нужно нажать кнопку, чтобы увидеть изменения? (извините, не очень опытен с git.) У меня есть изображение / gif в репо, и я несколько раз использовал разные версии этого изображения, и я полагаю, что это увеличило размер .git.
giorgim 03
Привет, к сожалению, именно так теперь вы очищаете старую двоичную версию. Для этого вам нужно переписать свою историю, что на самом деле сложно. Вот некоторые подсказки
Дэвид Дехан,
22

Я пробовал их, но мой репозиторий все еще был очень большим. Проблема заключалась в том, что я случайно проверил некоторые сгенерированные большие файлы. После некоторого поиска я нашел отличное руководство, которое позволяет легко удалять большие сгенерированные файлы. Этот учебник позволил мне уменьшить размер моего репозитория с 60 МБ до <1 МБ.

Стив Лорек, Как уменьшить размер репозитория Git

Крис Хиншоу
источник
4
Вот архивная версия на случай гниения ссылок. Этот ответ / был полезен для репо, с которым я столкнулся, где были зафиксированы файлы .exe и .zip, которые
увеличили
9

5 ГБ против 200 МБ - это как-то странно. Попробуйте запустить git gc.

Но нет, если вы не разделите свой репозиторий на модули, вы не сможете уменьшить размер .gitкаталога.

Каждый клон репозитория git - это полноценный репозиторий, который может действовать как сервер. Это основной принцип распределенного контроля версий.

Шимон Тот
источник
3

Я использую git больше как механизм синхронизации, чем для истории версий. Итак, мое решение этой проблемы заключалось в том, чтобы убедиться, что все мои текущие источники находятся в удовлетворительном состоянии, а затем просто удалить .git и повторно инициализировать репозитории. Проблема с дисковым пространством решена. :-) История ушла :-( Я делаю это, потому что мое репо находится на маленьком USB-ключе. Мне не нужна и не нужна вся моя история. Если бы у меня был метод простого усечения истории, я бы использовал его.

Если бы меня интересовало сохранение моей истории, я бы заархивировал текущий репозиторий. В какой-то момент позже я смогу клонировать исходный репозиторий, скопировать все изменения из нового репозитория (предположим, я не делал много (каких-либо) переименований или удалений). А затем сделайте одну большую фиксацию, которая будет представлять все изменения, сделанные в новом репо, как одну фиксацию в старом репо. Можно ли слить истории? Может быть, если бы я использовал ветку, а затем удалил ненужные мне объекты. (Я недостаточно знаю о внутреннем устройстве git, чтобы начать так дурачиться).

Даррел Ли
источник
1
Вместо этого вы можете просто использовать Dropbox для этого варианта использования. Я делал это много лет.
Джонни
0

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

JerryGoyal
источник
Мне пришлось использовать то же решение, потому что мой диск был заполнен (папка .git была> 90 ГБ), поэтому я даже не мог запустить репак или git gc!
Fl4v