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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

git gc

в голом репозитории

[email protected]:/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)...

Ответ 3

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

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

Ответ 4

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

Там будет не так много с git 2.11+ (Q4 2016) и крюком pre-receive.
В этом случае вам не придется запускать git gc вообще.

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

receive-pack: объекты карантина до тех пор, пока не примет прием

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

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

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

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