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


291

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

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

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


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.


В другом сценарии см. Также 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 КБ.


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.