Есть ли способ уменьшить размер папки git?

156

Похоже, мой проект становится все больше и больше с каждым мерзавцем commit/push. Есть ли способ очистить мою папку git?

Шихан Алам
источник

Ответы:

214

Я не уверен, что вы хотите. Прежде всего, конечно, каждый раз, когда вы делаете коммит / push, каталог становится немного больше, так как он должен хранить каждый из этих дополнительных коммитов.

Однако, вероятно, вы захотите, git gcкоторый будет «очищать ненужные файлы и оптимизировать локальный репозиторий» ( страница руководства ).

Другая, возможно, релевантная команда, git cleanкоторая удалит неотслеживаемые файлы из вашего дерева ( страница руководства ).

houbysoft
источник
30
git clean -d -f -x удаляет файлы, перечисленные в .gitignore и т.п. Например, рабочие пространства, которые не принадлежат git, папке Pods и т. Д.
Kalle
102
WARNINGКоманда, как написано выше @Kalle, удалит ВСЕ > ФАЙЛ И СПРАВОЧНИК В СВОЕМ GIT ROOT , а не только «файлы, перечисленные в .gitignore». Все, что не отслеживается Git, независимо от того, включено ли оно в список, .gitignoreбудет удалено. git clean -dfX(обратите внимание на регистр на X) удалит только те элементы, для которых применимо правило .gitignore. Пожалуйста, обратите внимание на это предупреждение: Никогда не запускайте его, git cleanне запуская его в интерактивном режиме, -iвместо того -f, чтобы , по крайней мере, сначала выполнить пробный прогон, -nа затем снова с -f.
Адриан Гюнтер
5
Или сделав резервную копию :-)
Матин Улхак
61

Бегать:

git remote prune origin

Удаляет все устаревшие ветви отслеживания, которые уже были удалены, originно все еще доступны локально в remotes/origin.

git gc --auto

' G arbage C ollection' - выполняет хозяйственные задачи (сжимает ревизии, удаляет незакрепленные / недоступные объекты). --autoФлаг первым определяет, требуется ли какая - либо работа, и выходит , не делая ничего , если нет.

phamductri
источник
4
Некоторое объяснение того, что они делают? Я знаю, что мы можем гуглить их и искать их документацию, но обычной практикой является предоставление краткого описания вашего ответа, когда речь идет только о коде или командах.
Джунейт
28

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

Другой - тот, где у вас есть огромное количество файлов в одном репо (что является пределом git ) вместо нескольких подпереговоров ( управляемых как подмодули ).

В этой статье о git space AlBlue упоминает:

Обратите внимание, что Git (и Hg, и другие DVCS) страдают от проблемы, когда (большие) двоичные файлы регистрируются, а затем удаляются, так как они все равно будут отображаться в репозитории и занимать место, даже если они не являются текущими ,

Если в вашем git-репозитории хранятся большие двоичные файлы, вы можете рассмотреть следующие вопросы:

Как я уже говорил в « Каковы пределы файлов в Git (количество и размер)? », Тем более в последнее время (2015, через 5 лет после этого ответа) Git LFS из GitHub является способ управления этими большими файлами (сохраняя их вне Git репозиторий).

VonC
источник
1
Поддержка больших файлов git полезна, если у вас регулярно добавляются / обновляются большие двоичные файлы (например, изображения). Смотрите git-lfs.github.com . Супер прост в реализации, поддерживается GitHub. Все члены команды должны установить его, чтобы использовать его совместно.
Эрик Вудс
@EricWoods Правда. Я упоминал Git-LFS раньше (64 раза: stackoverflow.com/search?tab=newest&q=user%3a6309%20git-lfs ). Я отредактировал этот старый ответ соответственно.
VonC
Ха, действительно! Забавно, что ответ 9+ лет все еще актуален (и теперь еще больше с информацией LFS).
Эрик Вудс
22

да да git gc это решение, естественно,

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

но здесь есть нечто более важное ...

секунды, в течение которых вы ожидаете обработки этого огромного Git & Externals, превращаются в долгие минуты, которые собираются в часы неэффективного затраченного времени,

Создайте новый (полностью, а не просто ветвь) репозиторий с нуля , включая единственную последнюю версию файлов, естественно, вы потеряете всю историю,

но когда в мире кода не настало время сентиментальности, нет смысла тащить весь 5-летний код каждый коммит или разность, вы все равно можете хранить старые git & externals где-нибудь, если вы испытываете ностальгию:]

но в какой-то момент вы действительно должны двигаться дальше:]

ваша команда поблагодарит вас!

Сообщество
источник
12
Полностью согласен, мы недавно использовали этот подход со старым хранилищем и не оглядывались назад; ну, в основном, потому что мы не можем, но вы знаете, что я имею в виду :)
WhatIsHeDoing
13

Выполнение этой команды чрезвычайно опасно, но сократит ваш репозиторий, удалив все ваши файлы git recovery / backup:

git reflog expire --expire=now --all && git gc --prune=now --aggressive

Он удалит все файлы, которые использует git для восстановления вашего репозитория по какой-то неправильной команде, например, если вы это сделали git reset --hard, вы обычно можете восстановить потерянные файлы. Но если вы делаете git reset --hardдо git reflog expire...команды, то вы все потеряли. Теперь ваша единственная надежда - использовать какой-нибудь инструмент, который анализирует вашу файловую систему и пытается восстановить стертые файлы, если они не были переопределены.

пользователь
источник
3
Я действительно не назвал бы это чрезвычайно опасным . Я бы просто назвал это тем, с чем вы должны быть осторожны . По моему опыту, очень немногие действительно когда-либо касаются рефлогов или недоступных объектов - большинство даже не знают, что они там или как с ними взаимодействуют, и поэтому застряли в ситуациях, когда они были бы полезны, или делали вещи ужасно неэффективный способ. Я бы сказал, что если вы не знаете и не можете понять, что будут делать эти команды, вы можете спокойно их запускать!
Крис Морган
10

git clean -d -f -i это лучший способ сделать это.

Это поможет сделать уборку более контролируемой.

-i обозначает интерактивный.

anandharshan
источник
3
Хотя вопрос ОП является расплывчатым, и это хороший ответ в этом отношении, я хочу отметить, что речь идет git cleanне об очистке репо, а об очистке каталога. Для пользователей, которые слепо копируют / вставляют, будьте осторожны; это удаляет неотслеживаемые файлы / каталоги, которые вы могли бы на самом деле хотеть локально.
срабой
git clean -d -x -f прекрасно работает, если вы хотите глубокой очистки
Rishabh Jain
2

Не знаю, уменьшит ли он это, но после запуска git cleanя часто так и делаю git repack -ad, что уменьшает количество файлов пакета.

Дэмиен Сойер
источник
5
Перепаковка является частью git gcпроцесса, поэтому нет необходимости запускать ее отдельно
artkoshelev