Git: как перепаковать все свободные коммиты

После использования git gc а также git repack (с различными вариантами) У меня все еще есть 4825 свободных коммитов в папке .git/objects, Я хотел бы, чтобы все они были в файле пакета вместе с остальными или в другом файле пакета.

Я много переписываю коммиты (исправляем + перебазирую), поэтому вполне нормально иметь много недоступных коммитов. Мой.gitconfig содержит эти параметры, чтобы хранить рефлоги и недостижимые коммиты в течение длительного времени.

[gc]
    reflogExpire = 300 days
    reflogExpireUnreachable = 200 days
    pruneExpire = 90 days

Вы можете задаться вопросом, имеет ли это смысл, но я уже нуждался и восстановил несколько коммитов, сделанных несколько месяцев назад. Бывает, что в течение многих месяцев мы разрабатываем новый набор веток с более высоким приоритетом, а затем продолжаем работу с более старыми ветками с более низким приоритетом.

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

2 ответа

Учитывая, что git bundle используется только для упаковки объектов (вызывая fetch-pack), вы пытались связать, а затем клонировать репо?

git bundle create aBundle --all # hopefully package everything, 
                                # the result being *one* file.
git clone aBundle newRepo       # recreate a full repo
# check if the cloned repo contains only packaged object

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

Предупреждение от git-gui - это просто подсказка, что вы, возможно, захотите сделать какое-то обслуживание. Для большинства людей наличие большого количества объектов просто замедляет их. В вашем случае вы должны отключить предупреждение. Рассматриваемая функция hint_gc и он вызывается ближе к концу файла сценария git-gui. Просто закомментируйте это, как показано ниже.

if {[is_enabled multicommit]} {
        #after 1000 hint_gc
}

Мультикоммитный бизнес - это флаг, который определяет, выполняем ли мы как committool или приложение общего назначения.

Если вы хотите использовать git-gui обычно где-то еще, вы можете вместо этого добавить специальный флаг для репозитория. Что-то вроде:

if {[is_enabled multicommit] && ![is_config_true gui.skip_gc_warning]} {
        after 1000 hint_gc
}

должен позволить вам использовать git config --bool gui.skip_gc_warning true отключить это для каждого хранилища.

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