Как часто нужно использовать 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?
Примечание: установка gc.autodetach
(Git 2.0 Q2 2014) может помочь запустить git gc --auto
без блокировки пользователя. см. мой ответ ниже.
В основном это зависит от того, насколько используется репозиторий. Если один пользователь регистрируется один раз в день, а операция ветвления / слияния и т. д. - один раз в неделю, вам, вероятно, не нужно запускать ее чаще, чем один раз в год.
Несколько десятков разработчиков работают над несколькими десятками проектов, каждый из которых проверяет 2-3 раза в день, поэтому вы можете запускать его каждую ночь.
Однако не повредит запускать его чаще, чем необходимо.
Что бы я сделал, так это запустить его сейчас, а через неделю измерить использование диска, запустить его снова и снова измерить использование диска. Если он упадет в размере на 5%, запускайте его раз в неделю. Если падает больше, запускайте чаще. Если падает меньше, запускайте реже.
В руководстве сказано: «Некоторые команды git запускают git gc --auto после выполнения операций, которые могут создать много незакрепленных объектов». Кто-нибудь знает, какие команды на самом деле его запускают?
Большой git rebase - очевидный пример, поскольку многие коммиты переписываются в новую историю - в вашем репо остается много старых коммитов, которые больше не являются частью текущей ветки.
«Не повредит запускать его чаще, чем нужно» ... Я не совсем согласен. Как указывает Аристотель, висячие коммиты могут стать хорошим механизмом резервного копирования.
Бросьте его в задание cron, которое запускается каждую ночь (днем?), Когда вы спите.
Стоит ли делать это для всех репозиториев github?
Я использую git gc после того, как провожу большую проверку и у меня много новых объектов. это может сэкономить место. Например. если вы проверяете большой проект SVN с помощью git-svn и выполняете git gc, вы обычно экономите много места
Это все еще правда? Даже в 2008 году место на жестком диске было дешевым, использовать это как оправдание для запуска кажется бессмысленным.
Последние версии git запускают gc автоматически, когда это необходимо, поэтому вам не нужно ничего делать. См. Раздел «Параметры» в человек git-gc (1): «Некоторые команды git запускают git gc --auto после выполнения операций, которые могут создать много незакрепленных объектов».
Я только что впервые запустил его в репозитории, которому несколько лет, и мой .git вырос с 16M до 2,9M, уменьшившись на 82%. Поэтому все еще кажется полезным запускать команду вручную.
@DarshanRivka: Вы обновляли git за эти несколько лет?
@ std''OrgnlDave Да, я всегда запускал ту версию, которая была текущей на Arch. Я просто запустил его снова, может быть, впервые с момента моего последнего комментария (благодаря вашему комментарию, который напомнил мне), и мой .git вырос с 81M до 13M. Полагаю, я не должен запускать какие-либо команды, запускающие gc --auto
.
Обратите внимание, что обратная сторона сбора мусора в вашем репозитории заключается в том, что мусор собирается. Как мы все как пользователи компьютеров знаем, файлы, которые мы сейчас считаем мусором, могут оказаться очень ценными через три дня в будущем. Тот факт, что git хранит большую часть своего мусора, несколько раз спасал мой бекон - просматривая все болтающиеся коммиты, я восстановил много работы, которую я случайно запретил.
Так что не будьте слишком аккуратны в своих личных клонах. В этом нет необходимости.
OTOH, ценность возможности восстановления данных сомнительна для репозиториев, используемых в основном как удаленные, например. место, куда все разработчики толкают и / или откуда вытаскивают. Там было бы разумно часто запускать сборку мусора и переупаковку.
FWIW не все незакрепленные объекты собираются мусором, по умолчанию только те, которые старше 2 недель (см. git gc --help
, в частности вариант --prune
). Также упоминается gc.reflogExpire
, что наводит меня на мысль, что любые фиксации, которые вы посетили за последние 90 дней, не будут собраны. (Моя версия git: v1.7.6)
Если вы используете 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 согласен. Когда я писал это, я просто хотел обратить на это внимание. И Git-Gui
, и count-objects
не совсем хорошие ответы на вопрос здесь ... Но они должны быть!
я не имел в виду, что это плохой ответ, просто хотел указать, что большую часть времени git gui ничего не делает. хотя я полагаю, что git gc тоже мало что делает, за исключением случаев, когда есть достаточно, или вы использовали агрессивный переключатель.
Вы можете сделать это без каких-либо перерывов с новым (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. Butgc output
is not really interesting.
You can keep it in foreground by changinggc.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 daemonizedgc --auto
and print it next timeWhile 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 ofcmd_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 savesstderr
to$GIT_DIR/gc.log
.
Followinggc --auto
will not run andgc.log
printed out until the user removesgc.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
не был запущен, когда произошло это нажатие. …?
Вам не обязательно использовать git gc
очень часто, потому что git gc
(сборка мусора) запускается автоматически для нескольких часто используемых команд:
git pull
git merge
git rebase
git commit
Подобные задачи - главные кандидаты для cron (если вы используете Linux) minhajuddin.com/2011/12/09/…