Почему мой репозиторий Git намного больше, чем версия Mercurial?
Я преобразовал репозиторий Mercurial в Git, используя fast-export. Но репозиторий Git огромен: 18 ГБ для Git против 3.4 ГБ для Mercurial. Ни один из моих шагов очистки не помог.
В My Mercurial repository доминирует один файл размером 65 МБ (карты Anki в формате SQLite), который ежедневно обновляется. Его история выросла до 2,9 ГБ, под .hg/store/data.
Я надеялся, что Git сможет сжать историю немного лучше, но я не смог сжать репозиторий ниже 18 ГБ!
Я пробовал git prune
, git gc
, а другие - безрезультатно. Я даже попробовал застегнуть папку .git, и все равно вышло ровно 18 ГБ.
Я что-то пропустил?
Обновление: Я попробовал Bazaar (bzr), и он сжал мой репозиторий только на 2,3 ГБ. Ницца!
Ответы
Ответ 1
Если git gc
не работает, попробуйте вручную запустить git repack
, а затем git gc
.
Мои наблюдения с SVN, Git и Hg:
Я всегда замечал, что хранилища SVN и Hg намного меньше, чем соответствующие репозитории Git. Это связано с тем, что каждое изменение файла - текстовое или двоичное, добавляет к нему новый полный объект. В SVN добавляется только diff, даже в случае двоичных файлов, а также двоичные различия в SVN тоже очень хороши.
Но именно там появляются файлы пакетов, поскольку они хранят только diff (delta) среди похожих объектов и даже сжаты. Даже с упаковкой я заметил, что хранилища Git, в зависимости от типа файлов и количества изменений, которые проходят эти файлы, имеют тенденцию быть больше. Это то, к чему я пришел, чтобы согласиться с Git, и это компромисс, который я готов принять, учитывая, насколько быстро выполняются различные операции с Git.
Ответ 2
Одна из причин может заключаться в том, что Mercurial имеет очень компактный формат хранения, который включает различия, даже для двоичных файлов. И так как использование diff для повторного создания версий может занять много времени, он сохранит полный моментальный снимок, как только diffs + old original превысит двойной размер полного моментального снимка.
Лично я попытался бы сохранить дамп вашей базы данных sqlite вместо самого файла базы данных и посмотреть, откуда это вы. Это может быть намного эффективнее.
Я не знаю, что такое формат хранения git. Но я предполагаю, что это не связано с различиями так же, как Mercurial.
Ответ 3
Запуск git gc --aggressive
в репозитории, перенесенном из Mercurial, работал у меня. Он сократился с 500 МБ до 150 МБ.