Репозиторий Git по-прежнему огромен после удаления больших файлов из истории репозитория - PullRequest
5 голосов
/ 30 июля 2011

У меня есть кодовая база, которая (до сих пор) использовала git для хранения своих зависимостей.Сам репозиторий доступен здесь (предупреждение: оно ОГРОМНО).Излишне говорить, что мне нужно удалить зависимости из истории репозитория, чтобы сократить их до разумного размера.

Я начал с использования инструкции Дэвида Андерхилла для удаления libсправочник из истории.Однако даже после этого размер хранилища все еще превышает 300 миллионов.Выпуск git prune и git repack помогает, но он все еще превышает 180 млн.

В попытке найти раздутые капли я выпустил

git verify-pack -v .git/objects/pack/pack-*.idx | grep -v chain | sort -k3nr | head

со следующими результатами:

105526b5d3d398b9989d88c2f9fc2d1dc96a85b8 блоб 35685609 33600527 31978828 d296935e6ac5f3f58b50c789394c9769116e9c34 блоб 35658016 33593241 112485744 50636f931180a32764edadd854968a971a083f8a блоб 28360290 25897864 233390 b9e4dd37428e879a258f297b7f5bcfb9ba869695 блоб 13108002 11640713 66661788 08d2720b2414aa07ce419b17d5f80c333c7313b7 блоб 12551621 11124009 89231035 6197a478a461275a0396f20c28487e9ae619a5f9 блоб 11975135 11058259 148211988 1 50636f931180a32764edadd854968a971a083f8a 549eb0c73776fd0ede27a2fcb03366f76f45a13c блоб 9136086 8166649 166451273 5bc0a0f04a7004bc16cfab1c091c6b369fb74049 блоб 9072616 8270262 80951514 741480238a6a6ce612cf089245dd46d6890fba9f блоб 88585698080252 101294029 744226651c55b14c1aa8affb78fba4fdf02b577c blob 7412220 6766404 186825167

Вот где я застрял.Я могу git show эти BLOB-объекты и увидеть, что они очень похожи на файлы JAR, но я не могу понять, почему они все еще находятся в репо.

Различные попытки найти их имена файлов не удалось.

git repack -a, git repack -ad и git repack -Ad, похоже, не имеют никакого эффекта.

Ответы [ 4 ]

13 голосов
/ 02 марта 2013

Использование --prune=now на git gc

Несмотря на то, что вы успешно вычеркнули ненужные объекты из истории, похоже, что эти нежелательные объекты не были удалены, потому что они были слишком молоды , чтобы их можно было удалить по умолчанию (см. Документацию по настройке ). на git gc для более подробной информации). Использование git gc --prune=now должно справиться с этим, или вы можете увидеть этот ответ для более ядерной опции.

Хотя это и должно решить вашу последнюю проблему, основной проблемой была сложность поиска больших сгустков для их удаления с использованием git filter-branch - на что я бы сказал:

... не используйте git filter-branch

git filter-branch болезненно использовать для подобных задач, и есть гораздо лучший, менее известный инструмент под названием BFG , , специально разработанный для удаления Большие файлы из репозитория Git.

Основная команда для удаления больших файлов выглядит так:

$ bfg  --strip-blobs-bigger-than 10MB  my-repo.git

Любой BLOB-объект размером более 10 МБ (которого нет в вашем последнем коммите) будет полностью удален из истории вашего репозитория - вам не нужно вручную находить файлы себя и файлы в защищенных коммитах безопасны .

Затем вы можете использовать git gc, чтобы очистить мертвые данные:

$ git gc --prune=now --aggressive

BFG обычно в 1045 * раз в сотни раз быстрее , чем git-filter-branch в большом репо, и опции адаптированы к этим двум распространенным сценариям использования:

  • Удаление Сумасшедшие большие файлы
  • Удаление Пароли, учетные данные и другие Личные данные

Полное раскрытие: я являюсь автором репо-очистителя BFG.

4 голосов
/ 30 июля 2011

Вы пробовали запустить git gc?http://www.kernel.org/pub/software/scm/git/docs/git-gc.html

3 голосов
/ 03 января 2013

Вам необходимо запустить сценарий Дэвида Андерхилла для каждой ветви в хранилище, чтобы убедиться, что ссылки удалены из всех ветвей.

Затем, как в дальнейшем обсуждении, инициализируйте новый хранилище.с git init и git pull от оригинала или git remote add origin <original>, а затем потяните все ветви.

$ du -sh ./BIG
299M ./BIG
$ cd BIG
$ git checkout master
$ git-remove-history REMOVE_ME
....
$ git checkout branch2
$ git-remove-history REMOVE_ME
...
$ cd ../SMALL
$ git init
$ git remote add origin ../BIG
$ git fetch --all
$ git checkout master
$ cd ..
$ du -sh ./SMALL ./BIG
26M ./SMALL
244M ./BIG
1 голос
/ 31 августа 2014

Я случайно сохранил большие .jpa резервные копии моего сайта в git -

git filter-branch --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch MY_BIG_DIRECTORY_OR_FILE' --tag-name-filter cat -- --all

Relpace MY_BIG_DIRECTORY_OR_FILE с соответствующей папкой, чтобы полностью переписать историю, включая теги.

источник:

http://naleid.com/blog/2012/01/17/finding-and-purging-big-files-from-git-history

...