Уменьшить размер репозитория git

291

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

Я добавил обычных подозреваемых (log, vendor, doc и т. Д.) В .gitignore. Хотя я только добавил .gitignore недавно.

Какие-либо предложения?

Sent-Хил
источник
1
Я только что сделал, и это снизило его до 2,2 мб ... спасибо большое! Хотя это, похоже, не уменьшило размер репо на Heroku..hmm
sent-hil
11
Нажмите на это с помощью --force. Он будет перезаписывать содержимое, даже если не было никаких изменений (без новых коммитов и т. Д.)
Marcin Gil
1
@MarcinGil - ниже VonC заявляет, что вам необходим доступ к серверу для очистки удаленного сервера (если я правильно его анализирую).
jww
1
Просто комментарий, чтобы помочь другим читателям, если они не знают, что добавить .gitignore, есть хороший сервис на gitignore.io, который поможет вам создать хороший продукт, .gitignoreоснованный на вашей среде разработки.
Blairg23

Ответы:

354

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.

VonC
источник
В другом сценарии см. Также stackoverflow.com/questions/1029969/…
VonC
1
Примечание для себя: не забывайте об удаленных ветвях: stackoverflow.com/questions/11255802/…
VonC
1
Примечание для себя: не забывайте удаленные теги
saiyancoder
1
В дополнение к удаленным ссылкам, reflog - это еще одна вещь, которая может привести к тому, что ссылки, которые вы пытаетесь удалить, будут сохранены. stackoverflow.com/q/27489761/1072626
vossad01
1
@jww Я подтверждаю, что это чисто локальная операция. Это не имеет никакого отношения к размеру удаленного репо. Вам понадобится прямой доступ к серверу этого удаленного репо, чтобы сделать то же самое.
VonC
95

Спасибо за ваши ответы. Вот что я сделал:

git gc
git gc --aggressive
git prune

Это, казалось, сделало трюк. Я начал с около 10,5 МБ, и теперь это немного больше, чем 980 КБ.

Sent-Хил
источник
9
pruneвсегда запущен gc(по умолчанию 2 недели назад).
Cas
118
Вы можете запустить все 3 с черносливом до сих пор, используяgit gc --aggressive --prune=now
rahul286
1
Но когда я удаляю репо, а затем клонирую его снова, размер все еще велик. Как вы справляетесь с этим?
cttuan
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
vinzee
источник