Как запустить сборку мусора в удаленном хранилище Git?

Как мы знаем, мы можем периодически запускать git gc упаковать предметы под .git/objects,

В случае с удаленным центральным репозиторием Git (пустым или нет), однако, после многих нажатий, там много файлов под myproj.git/objects; Кажется, что каждый коммит создает новый файл.

Как я могу упаковать столько файлов? (Я имею в виду те, что находятся в удаленном центральном репозитории, а не в локальном репозитории клонов.)

4 ответа

Решение

Удаленный репозиторий должен быть настроен на запуск gc по мере необходимости после принятия коммита. Смотрите документацию по gc.auto на страницах руководства git-gc и git-config.

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

Таким образом, gc нужен больше для перепаковки, то есть для экономии места на диске, а не для удаления реального мусора. Для этого достаточно переменной gc.auto.

В то время как у вас должен быть какой-то процесс, который позаботится об этом периодически, автоматически, это не проблема запустить

git gc

на голом хранилище

git@domU:/pix/git/repositories/abd.git$ ls -l

total 28
drwxrwxr-x   2 git git    6 2010-06-06 02:44 branches
-rw-rw-r--   1 git git   66 2010-06-06 02:44 config
-rw-r--r--   1 git git   23 2011-03-15 18:19 description
-rw-rw-r--   1 git git   23 2010-06-06 02:44 HEAD
drwxrwxr-x   2 git git 4096 2010-06-06 02:44 hooks
drwxrwxr-x   2 git git   20 2010-06-06 02:44 info
drwxrwxr-x 260 git git 8192 2010-09-01 00:26 objects
drwxrwxr-x   4 git git   29 2010-06-06 02:44 refs

$ git gc
Counting objects: 3833, done.
Compressing objects:  31% (1085/3500)...

после многих толчков, там много файлов под myproj.git/objects

Не так много будет с git 2.11+ (4 квартал 2016 года) и ловушкой предварительного получения.
В этом случае вам не придется запускать git gc на всех.

См. Коммит 62fe0eb, коммит e34c2e0, коммит 722ff7f, коммит 2564d99, коммит 526f108 (03 октября 2016 г.) Джеффом Кингом ( peff )
(Объединено Юнио С Хамано - gitster - в коммите 25ab004, 17 октября 2016 г.)

receive-pack: помещать объекты в карантин, пока не получит предварительный прием

Чтобы принимающая сторона "git push" проверила полученную историю и приняла решение отклонить push, объекты, отправленные с отправляющей стороны, должны быть доступны для крючка и механизма для проверки соединения, и это было сделано традиционно храня объекты в принимающем хранилище и сдавая git gc "истечь его.

Вместо этого сохраняйте вновь полученные объекты во временной области и делайте их доступными, повторно используя механизм хранения альтернативных объектов для них, только когда мы решаем, принимаем ли мы проверку, и, как только мы решаем, либо переносим их в хранилище, либо удаляем их немедленно,

Эта временная область будет установлена ​​новой переменной среды GIT_QUARANTINE_ENVIRONMENT,

Таким образом, если (большой) толчок отклонен pre-receive крюк, эти большие объекты не будут лежать в течение 90 дней в ожидании git gc очистить их.

Этот вопрос должен пролить свет на то, как часто вы должны запускать сборку мусора.

Самый простой вариант - использовать запланированное задание в Windows или задание cron в Unix для запуска git gc периодически. Таким образом, вам даже не нужно думать об этом.

Другие вопросы по тегам