145M = .git / объекты / пакет /
Я написал скрипт, чтобы суммировать размеры различий для каждой фиксации и фиксации, прежде чем она уйдет в обратном направлении от конца каждой ветки. Я получаю 129 МБ без сжатия и без учета одинаковых файлов в ветвях и общей истории по веткам.
Git принимает во внимание все эти вещи, поэтому я ожидал бы гораздо меньшего размера репозитория. Так почему же .git такой большой?
Я сделал:
git fsck --full
git gc --prune=today --aggressive
git repack
Чтобы ответить на вопрос, сколько файлов / коммитов, у меня есть 19 веток по 40 файлов в каждой. 287 коммитов, найдено с использованием:
git log --oneline --all|wc -l
Информация об этом не должна занимать десятки мегабайт.
git repack -a -d
сократил мое репо с 956 МБ до 250 МБ . Большой успех! Благодарность!Ответы:
Недавно я вставил неправильный удаленный репозиторий в локальный (
git remote add ...
иgit remote update
). После удаления нежелательных удаленных ссылок, веток и тегов в моем репозитории осталось 1,4 ГБ (!) Потраченного впустую места. Я смог избавиться от этого только путем клонирования с помощьюgit clone file:///path/to/repository
. Обратите внимание, чтоfile://
при клонировании локального репозитория это имеет большое значение - копируются только объекты, на которые есть ссылки, а не вся структура каталогов.Изменить: вот один лайнер Яна для воссоздания всех веток в новом репо:
источник
Некоторые скрипты, которые я использую:
git-fatfiles
Если вам нужно больше строк, см. Также версию Perl в соседнем ответе: https://stackoverflow.com/a/45366030/266720
git-eradicate (для
video/parasite.avi
):Примечание: второй скрипт предназначен для полного удаления информации из Git (включая всю информацию из рефлогов). Используйте с осторожностью.
источник
git-fatfiles
скрипт ( ) появился, когда я задал вопрос по IRC (Freenode / # git). Я сохранил лучшую версию в файл, а затем разместил ее здесь в качестве ответа. (Хотя я не могу указать автора в логах IRC).git gc
уже делает это,git repack
поэтому нет смысла вручную переупаковывать, если вы не собираетесь передавать ему какие-то специальные параметры.Первый шаг - проверить, занимает ли большая часть пространства (как обычно) ваша объектная база данных.
Это должно дать отчет о том, сколько распакованных объектов находится в вашем репозитории, сколько места они занимают, сколько у вас упакованных файлов и сколько места они занимают.
В идеале после переупаковки у вас не будет распакованных объектов и одного файла пакета, но совершенно нормально иметь некоторые объекты, на которые не ссылаются напрямую текущие ветки, все еще присутствующие и распакованные.
Если у вас есть одна большая упаковка, и вы хотите знать, что занимает пространство, вы можете перечислить объекты, из которых состоит пакет, а также то, как они хранятся.
Обратите внимание, что
verify-pack
требуется индексный файл, а не сам файл пакета. Это дает отчет о каждом объекте в пакете, его истинном размере и его упакованном размере, а также информацию о том, был ли он «дельтифицирован», и если да, то о происхождении дельта-цепочки.Чтобы увидеть, есть ли в вашем репозитории какие-либо необычно большие объекты, вы можете отсортировать вывод численно по третьему или четвертому столбцу (например
| sort -k3n
).Из этого вывода вы сможете увидеть содержимое любого объекта с помощью
git show
команды, хотя невозможно точно увидеть, где в истории фиксации репозитория имеется ссылка на объект. Если вам нужно это сделать, попробуйте что-нибудь из этого вопроса .источник
Просто к вашему сведению, самая большая причина, по которой вы можете остаться с нежелательными объектами, заключается в том, что git поддерживает журнал ссылок.
Reflog нужен для того, чтобы сохранить вашу задницу, когда вы случайно удалите свою основную ветку или каким-либо иным образом катастрофически повредите свой репозиторий.
Самый простой способ исправить это - обрезать ваши журналы рефлогов перед сжатием (просто убедитесь, что вы никогда не хотите возвращаться ни к одной из коммитов в журнале рефлогов).
Это отличается от
git gc --prune=today
того, что срок действия всего рефлога истекает немедленно.источник
Если вы хотите узнать, какие файлы занимают место в вашем репозитории git, запустите
git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5
Затем извлеките ссылку на большой двоичный объект, которая занимает больше всего места (последняя строка), и проверьте имя файла, которое занимает так много места.
git rev-list --objects --all | grep <reference>
Это может быть даже файл, который вы удалили
git rm
, но git помнит его, потому что на него все еще есть ссылки, такие как теги, пульты дистанционного управления и журнал ссылок.Как только вы узнаете, от какого файла хотите избавиться, я рекомендую использовать
git forget-blob
https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/
Легко использовать, просто сделайте
git forget-blob file-to-forget
Это удалит все ссылки из git, удалит большой двоичный объект из каждой фиксации в истории и запустит сборку мусора, чтобы освободить место.
источник
Скрипт git-fatfiles из ответа Ви прекрасен, если вы хотите увидеть размер всех ваших блобов, но он настолько медленный, что его нельзя использовать. Я снял ограничение вывода в 40 строк, и вместо завершения попытался использовать всю оперативную память моего компьютера. Поэтому я переписал его: это в тысячи раз быстрее, добавлены функции (необязательно) и удалена какая-то странная ошибка - старая версия давала неточные подсчеты, если вы суммировали результат, чтобы увидеть общее пространство, используемое файлом.
Назовите этот файл git-fatfiles.pl и запустите. Чтобы увидеть дисковое пространство, используемое всеми версиями файла, используйте
--sum
опцию. Чтобы увидеть то же самое, но для файлов в каждом каталоге, используйте--directories
параметр. Если вы установите модуль Number :: Bytes :: Human cpan (запустите «cpan Number :: Bytes :: Human»), размеры будут отформатированы: «21M /path/to/file.mp4».источник
Вы уверены, что учитываете только файлы .pack, а не файлы .idx? Они находятся в том же каталоге, что и файлы .pack, но не имеют данных репозитория (как указывает расширение, они не более чем индексы для соответствующего пакета - на самом деле, если вы знаете правильную команду, вы можете легко воссоздать их из файла пакета, и git сам делает это при клонировании, поскольку только файл пакета передается с использованием собственного протокола git).
В качестве репрезентативного образца я взглянул на свой локальный клон репозитория linux-2.6:
Это означает, что расширение примерно на 7% должно быть обычным явлением.
Есть также файлы снаружи
objects/
; в моем личном опыте, из нихindex
и , какgitk.cache
правило, самые крупные из них ( на общую сумму 11M в моем клоне репозитория Linux-2.6).источник
Другие объекты git, хранящиеся в,
.git
включают деревья, коммиты и теги. Коммиты и теги небольшие, но деревья могут стать большими, особенно если у вас очень большое количество маленьких файлов в вашем репозитории. Сколько файлов и сколько коммитов у вас есть?источник
Вы пробовали использовать git repack ?
источник
перед выполнением git filter-branch и git gc вы должны просмотреть теги, которые присутствуют в вашем репо. Любая реальная система, которая имеет автоматические теги для таких вещей, как непрерывная интеграция и развертывание, будет делать неотмеченные объекты по-прежнему ссылаться на эти теги, поэтому gc не может их удалить, и вы все равно будете задаваться вопросом, почему размер репо по-прежнему так велик.
Лучший способ избавиться от всего нежелательного - запустить git-filter и git gc, а затем отправить master в новое голое репо. Новое чистое репо будет иметь очищенное дерево.
источник
Это может произойти, если вы случайно добавили большой кусок файлов и разместили их, не обязательно фиксируя их. Это может произойти в
rails
приложении, когда вы запускаете,bundle install --deployment
а затем случайноgit add .
видите, что все файлы, добавленные подvendor/bundle
вами, деактивируют их, но они уже попали в историю git, поэтому вам нужно применить ответ Ви и изменитьvideo/parasite-intro.avi
, аvendor/bundle
затем запустить вторую команду, которую он предоставляет.Вы можете видеть разницу, с
git count-objects -v
которой в моем случае перед применением скрипта размер пакета был равен 52 КБ, а после применения - 3,8 КБ.источник
Стоит проверить файл stacktrace.log. По сути, это журнал ошибок для отслеживания неудачных коммитов. Недавно я узнал, что мой stacktrace.log составляет 65,5 ГБ, а мое приложение - 66,7 ГБ.
источник