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