Как я могу запустить сборку мусора в удаленном репозитории 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
, чтобы очистить их.