Git: как перепаковать все свободные коммиты - PullRequest
7 голосов
/ 28 ноября 2011

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

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

1 голос
/ 28 ноября 2011

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

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

...