Как запустить сборку мусора в удаленном хранилище Git? - PullRequest
50 голосов
/ 02 июля 2010

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

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

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

Ответы [ 4 ]

49 голосов
/ 02 июля 2010

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

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

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

13 голосов
/ 13 июня 2011

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

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)...
4 голосов
/ 02 июля 2010

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

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

3 голосов
/ 25 октября 2016

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

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

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

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

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

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

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

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

...