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
отключить это для каждого хранилища.