Как избежать того, что «git gc» генерирует объекты мусора?

До того, как я побежал git gc, у меня было несколько тысяч незакрепленных предметов:

$ git count-objects -v
count: 3706
size: 17164
in-pack: 147149
packs: 9
size-pack: 46619
prune-packable: 0
garbage: 0
size-garbage: 0

(обратите внимание на незакрепленный предмет count и size). После git gc у меня было больше:

$ git count-objects -v
count: 6735
size: 19687
in-pack: 142215
packs: 1
size-pack: 43373
prune-packable: 0
garbage: 0
size-garbage: 0

Я знаю, что это происходит потому, что git gc выселяет объекты из пакетов, когда они становятся недоступными; это дает им новую «аренду жизни» в качестве незакрепленных объектов.

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

Я бегаю git gc максимум раз в месяц. По какой-то причине, которую я не знаю, git gc --auto почти никогда не запускается (и я не хочу это менять).

Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
218
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если вы Конечно, никакая другая команда Git не выполняется в этом репозитории в то время, когда вы запускаете git gc в этом репозитории, вы можете добавить --prune=all. По умолчанию используется --prune=2.weeks.ago, что дает другим запущенным командам 14 дней для завершения своей работы; например, вы можете использовать --prune=1.day.ago, чтобы дать им меньше времени.

Вы также можете настроить gc.pruneExpire: если он не установлен, по умолчанию используется 2.weeks.ago, что приводит к указанному выше значению по умолчанию. Как заметки j6t, вариант настройки gc.pruneExpire это now, а не all. Однако неразумно устанавливать здесь now: автоматический git gc будет использовать это значение. а также будет работать в фоновом режиме, в то время как другие операции Git выполняются.

Обратите внимание, что если у вас есть версия Git >= 2.5, но ниже 2.15.0, уменьшенный gc.pruneExpire может сломать ваши добавленные рабочие деревья за меньшее время, чем две недели по умолчанию. Ошибка заключается в том, что git gc не может использовать HEAD и индекс добавленного рабочего дерева в качестве отправной точки для обхода достижимости объекта DAG. В результате git gc может удалить добавленные большие двоичные объекты, которые еще не были зафиксированы, и, если у вас есть рабочее дерево с отсоединенным HEAD, даже некоторые фиксации. Исправление Лучший для этого заключается в обновлении до 2.15.0 или более поздней версии, поскольку даже двухнедельного срока по умолчанию недостаточно.

Спасибо, это все. Я установил gc.pruneExpire на now, поскольку all — это просто неразборчивая дата, которая интерпретируется как now (и это может измениться в будущей версии Git).

j6t 01.04.2019 10:13

Слово предупреждение читателям, наткнувшимся на этот пост: если вы используете git worktree и Git до версии 2.15.0, git gc может сломать ваши вторичные рабочие деревья с настройкой gc.pruneExpire или без нее. Но установка на now делает много проще выстрелить себе в ногу!

j6t 01.04.2019 10:23

Интересно. Я собирался использовать now, но в документации сказано использовать all (!). Это может быть связано с тем, что установка pruneExpire на now неразумна (см. редактирование). И да, сборка мусора с добавленными рабочими деревьями прерывается в версиях с 2.5 по (но не включая) 2.15.0; Я сам столкнулся с этим.

torek 01.04.2019 16:58
pruneExpire указывает время. Был обсуждение недавно, что документация по крайней мере неточна, когда она говорит all. Это действительно должно быть now.
j6t 02.04.2019 14:09

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