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

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

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

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

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

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

Ответ 1

Учитывая, что 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

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

Ответ 2

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

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, чтобы отключить его для каждого репозитория.