Сквош каждый коммит старше 1 года в очень большом хранилище и ограниченном ресурсе

У меня есть 4-летний git-репозиторий, который начинает становиться действительно огромным: ~30GO, 60.000 файлов. Один или два коммита делаются каждый день. Я хотел бы раздавить каждый коммит старше 1 года в первый коммит. Но из-за технических проблем я не могу просто воссоздать репозиторий, мне приходится с ним работать. Доступная версия git 1.7.2.5 (обновление невозможно). Дисковое пространство ограничено 100go (таким образом, только 70go все еще доступно), а память устройства - 4go (19 месяцев подкачки, да MO...), также невозможно перенести репо на другой компьютер.

Я пробовал выбранное решение на этой странице Сквош первых двух коммитов в Git?, февральская версия 2009 года. Это работает до 'git rebase --onto'. Git-rebase вызывает ошибку OutOfMemory, я не уверен в ее причине, я думаю, что это возможно, потому что он пытается воспроизвести каждый коммит в одном кадре. Я думаю использовать git-cherry-pick и проигрывать каждый коммит по одному, а затем перемещать мастер вверху.

Это хорошая идея? или у кого есть идея получше? Thks!:)

2 ответа

прежде чем сделать это, убедитесь, что вы знаете функциональность git. git - это хранилище (ключ, значение), что весь хэш SHA1 представляет собой ключ и значение в двоичном формате, который хранится в.git/object

ты можешь видеть.gitпапка для поиска большого файла в этой папке, но одна из функций git — очистка и оптимизация репозитория, который работает с командой

Если у вас большой репозиторий, прежде чем что-либо делать, запустите эту команду, чтобы найти большой файл с помощью этой команды:

git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | sed -n 's/^blob //p' | sort --numeric-sort --key=2 | cut -c 1-12,41- | $(command -v gnumfmt || echo numfmt) --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest

в git мы никогда ничего не упускаем, если вы зафиксируете большой файл в git и удалите его, этот файл останется в истории git (в папке объекта), и одна из задач — постепенное удаление ненужного файла, который вы можете использовать.

git gc

git gc --aggressive

git prune

для оптимизации пространства

Маловероятно, что количество коммитов вызывает проблему, git очень эффективно сжимает текстовые файлы.

Лучший способ уменьшить размер репозитория git - использовать такой инструмент, как очиститель репозитория BFG, для удаления больших двоичных файлов из вашей истории.

Скомпилированные зависимости, такие как пакеты Nuget и Jars, должны храниться в основном в хранилище артефактов (не в git), процесс сборки приложения будет извлекать зависимости во время сборки.

Вы также можете использовать Git LFS для более прозрачного хранения бинарных файлов.

Другие вопросы по тегам