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