Как часто нужно использовать git-gc?

Как часто нужно использовать git-gc?

страница руководства просто говорит:

Users are encouraged to run this task on a regular basis within each repository to maintain good disk space utilization and good operating performance.

Есть ли какие-нибудь команды для подсчета количества объектов, чтобы узнать, пора ли gc?

Подобные задачи - главные кандидаты для cron (если вы используете Linux) minhajuddin.com/2011/12/09/…

Khaja Minhajuddin 09.12.2011 11:11

Примечание: установка gc.autodetach (Git 2.0 Q2 2014) может помочь запустить git gc --auto без блокировки пользователя. см. мой ответ ниже.

VonC 12.03.2014 20:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
239
2
114 684
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ответ принят как подходящий

В основном это зависит от того, насколько используется репозиторий. Если один пользователь регистрируется один раз в день, а операция ветвления / слияния и т. д. - один раз в неделю, вам, вероятно, не нужно запускать ее чаще, чем один раз в год.

Несколько десятков разработчиков работают над несколькими десятками проектов, каждый из которых проверяет 2-3 раза в день, поэтому вы можете запускать его каждую ночь.

Однако не повредит запускать его чаще, чем необходимо.

Что бы я сделал, так это запустить его сейчас, а через неделю измерить использование диска, запустить его снова и снова измерить использование диска. Если он упадет в размере на 5%, запускайте его раз в неделю. Если падает больше, запускайте чаще. Если падает меньше, запускайте реже.

В руководстве сказано: «Некоторые команды git запускают git gc --auto после выполнения операций, которые могут создать много незакрепленных объектов». Кто-нибудь знает, какие команды на самом деле его запускают?

Joshua Dance 08.07.2014 19:36

Большой git rebase - очевидный пример, поскольку многие коммиты переписываются в новую историю - в вашем репо остается много старых коммитов, которые больше не являются частью текущей ветки.

mafrosis 05.11.2014 09:11

«Не повредит запускать его чаще, чем нужно» ... Я не совсем согласен. Как указывает Аристотель, висячие коммиты могут стать хорошим механизмом резервного копирования.

Jason Baker 22.11.2014 19:10

Бросьте его в задание cron, которое запускается каждую ночь (днем?), Когда вы спите.

Стоит ли делать это для всех репозиториев github?

alper 17.01.2021 16:18

Я использую git gc после того, как провожу большую проверку и у меня много новых объектов. это может сэкономить место. Например. если вы проверяете большой проект SVN с помощью git-svn и выполняете git gc, вы обычно экономите много места

Это все еще правда? Даже в 2008 году место на жестком диске было дешевым, использовать это как оправдание для запуска кажется бессмысленным.

Thymine 21.07.2018 00:43

Последние версии git запускают gc автоматически, когда это необходимо, поэтому вам не нужно ничего делать. См. Раздел «Параметры» в человек git-gc (1): «Некоторые команды git запускают git gc --auto после выполнения операций, которые могут создать много незакрепленных объектов».

Я только что впервые запустил его в репозитории, которому несколько лет, и мой .git вырос с 16M до 2,9M, уменьшившись на 82%. Поэтому все еще кажется полезным запускать команду вручную.

Darshan Rivka Whittle 17.04.2015 01:00

@DarshanRivka: Вы обновляли git за эти несколько лет?

std''OrgnlDave 03.04.2019 22:57

@ std''OrgnlDave Да, я всегда запускал ту версию, которая была текущей на Arch. Я просто запустил его снова, может быть, впервые с момента моего последнего комментария (благодаря вашему комментарию, который напомнил мне), и мой .git вырос с 81M до 13M. Полагаю, я не должен запускать какие-либо команды, запускающие gc --auto.

Darshan Rivka Whittle 03.04.2019 23:46

Обратите внимание, что обратная сторона сбора мусора в вашем репозитории заключается в том, что мусор собирается. Как мы все как пользователи компьютеров знаем, файлы, которые мы сейчас считаем мусором, могут оказаться очень ценными через три дня в будущем. Тот факт, что git хранит большую часть своего мусора, несколько раз спасал мой бекон - просматривая все болтающиеся коммиты, я восстановил много работы, которую я случайно запретил.

Так что не будьте слишком аккуратны в своих личных клонах. В этом нет необходимости.

OTOH, ценность возможности восстановления данных сомнительна для репозиториев, используемых в основном как удаленные, например. место, куда все разработчики толкают и / или откуда вытаскивают. Там было бы разумно часто запускать сборку мусора и переупаковку.

FWIW не все незакрепленные объекты собираются мусором, по умолчанию только те, которые старше 2 недель (см. git gc --help, в частности вариант --prune). Также упоминается gc.reflogExpire, что наводит меня на мысль, что любые фиксации, которые вы посетили за последние 90 дней, не будут собраны. (Моя версия git: v1.7.6)

RobM 06.12.2011 22:28

Если вы используете Git-Gui, это говорит тебе, когда вам следует беспокоиться:

This repository currently has approximately 1500 loose objects.

Следующая команда выведет похожее число:

$ git count-objects

За исключением из своего источника, git-gui будет делать математику самостоятельно, фактически подсчитывая что-то в папке .git/objects и, вероятно, дает приближение (я не знаю, что tcl правильно это прочитает!).

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

На самом деле он предупреждает, но после запуска gc большую часть времени gc ничего не делает. Итак, полагаться на git gui, чтобы сделать это, - это дождаться более 6000 каких-то незакрепленных объектов, при этом всегда нужно нажимать либо запустить gc и подождать минуту, либо отменить: / Возможно, кто-то должен исправить git gui таким образом, чтобы он проверял максимальное количество количество объектов и не показывать диалог, пока количество не достигнет предела.

mlatu 13.02.2014 14:30

Да @mlatu согласен. Когда я писал это, я просто хотел обратить на это внимание. И Git-Gui, и count-objects не совсем хорошие ответы на вопрос здесь ... Но они должны быть!

cregox 13.02.2014 15:05

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

mlatu 13.02.2014 17:47

Вы можете сделать это без каких-либо перерывов с новым (Git 2.0 Q2 2014) параметром gc.autodetach.

См. совершить 4c4ac4d и совершить 9f673f9 (Нгуен Тай Нгок Дуй, он же pclouds):

gc --auto takes time and can block the user temporarily (but not any less annoyingly).
Make it run in background on systems that support it.
The only thing lost with running in background is printouts. But gc output is not really interesting.
You can keep it in foreground by changing gc.autodetach.


Однако, начиная с версии 2.0, была ошибка: git 2.7 (Q4 2015) обязательно не теряйте сообщение об ошибке.
См. совершить 329e6e8 (19 сентября 2015 г.), автор: Нгуен Тай Нгок Дуй (pclouds).
(Merged by Junio C Hamano -- gitster -- in commit 076c827, 15 Oct 2015)

gc: save log from daemonized gc --auto and print it next time

While commit 9f673f9 (gc: config option for running --auto in background - 2014-02-08) helps reduce some complaints about 'gc --auto' hogging the terminal, it creates another set of problems.

The latest in this set is, as the result of daemonizing, stderr is closed and all warnings are lost. This warning at the end of cmd_gc() is particularly important because it tells the user how to avoid "gc --auto" running repeatedly.
Because stderr is closed, the user does not know, naturally they complain about 'gc --auto' wasting CPU.

Daemonized gc now saves stderr to $GIT_DIR/gc.log.
Following gc --auto will not run and gc.log printed out until the user removes gc.log
.

Я использую, когда делаю большой коммит, прежде всего, когда удаляю больше файлов из репозитория .. после этого коммиты выполняются быстрее

Эта цитата взята из: Контроль версий с Git

Git runs garbage collection automatically:

• If there are too many loose objects in the repository

• When a push to a remote repository happens

• After some commands that might introduce many loose objects

• When some commands such as git reflog expire explicitly request it

And finally, garbage collection occurs when you explicitly request it using the git gc command. But when should that be? There’s no solid answer to this question, but there is some good advice and best practice.

You should consider running git gc manually in a few situations:

• If you have just completed a git filter-branch . Recall that filter-branch rewrites many commits, introduces new ones, and leaves the old ones on a ref that should be removed when you are satisfied with the results. All those dead objects (that are no longer referenced since you just removed the one ref pointing to them) should be removed via garbage collection.

• After some commands that might introduce many loose objects. This might be a large rebase effort, for example.

And on the flip side, when should you be wary of garbage collection?

• If there are orphaned refs that you might want to recover

• In the context of git rerere and you do not need to save the resolutions forever

• In the context of only tags and branches being sufficient to cause Git to retain a commit permanently

• In the context of FETCH_HEAD retrievals (URL-direct retrievals via git fetch ) because they are immediately subject to garbage collection

В моем дереве есть недостижимые коммиты (из-за git commit --amend). Это можно проверить с помощью git log --reflog. Я отправил ветку в удаленный репозиторий и снова проверил свое дерево; недостижимые коммиты все еще были там. Очевидно, git gc не был запущен, когда произошло это нажатие. …?

chharvey 27.02.2016 07:33

Вам не обязательно использовать git gc очень часто, потому что git gc (сборка мусора) запускается автоматически для нескольких часто используемых команд:

git pull
git merge
git rebase
git commit

Источник: git gc лучшие практики и часто задаваемые вопросы

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