Подтвердить что ты не робот

Почему мой репозиторий 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 ГБ. Ницца!

4b9b3361

Ответ 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 МБ.