(решенный, посмотрите нижнюю часть тела вопроса),
Поиск этого в течение долгого времени теперь, что я имею до настоящего времени:
В значительной степени тот же метод, но они оба оставляют объекты в файлах пакета... Застрявший.
Что я попробовал:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_name'
rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc
Все еще имейте файлы в пакете, и это - то, как я знаю это:
git verify-pack -v .git/objects/pack/pack-3f8c0...bb.idx | sort -k 3 -n | tail -3
И это:
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch file_name" HEAD
rm -rf .git/refs/original/ && git reflog expire --all && git gc --aggressive --prune
То же...
Испытанный git clone
прием, это удалило некоторые файлы (~3000 из них), но самые большие файлы все еще там...
У меня есть некоторые большие файлы прежней версии в репозитории, ~200M, и я действительно не хочу их там... И я не хочу сбрасывать репозиторий к 0 :(
РЕШЕНИЕ: Это - самый короткий способ избавиться от файлов:
refs/remotes/origin/master
строка для удаленного репозитория, удалите его, иначе мерзавец не удалит те файлыgit verify-pack -v .git/objects/pack/#{pack-name}.idx | sort -k 3 -n | tail -5
- проверять на самые большие файлыgit rev-list --objects --all | grep a0d770a97ff0fac0be1d777b32cc67fe69eb9a98
- проверять, что является теми файламиgit filter-branch --index-filter 'git rm --cached --ignore-unmatch file_names'
- удалить файл из всех измененийrm -rf .git/refs/original/
- удалить резервное копирование мерзавцаgit reflog expire --all --expire='0 days'
- истечь все свободные объектыgit fsck --full --unreachable
- проверять, существуют ли какие-либо свободные объектыgit repack -A -d
- переупаковкаgit prune
- наконец удалить те объекты Я не могу сказать точно без доступа к данным вашего репозитория, но мне кажется, что, вероятно, есть один или несколько упакованных ссылок на старые коммиты, сделанные до того, как вы запустили git-фильтр-отделение
. Это объясняет, почему git fsck --full --unreachable
не называет большой блок недоступным объектом, даже если вы просрочили свой рефлог и удалили оригинальные (распакованные) ссылки.
Вот что я бы сделал (после того, как git фильтр-отделение
и git gc
были сделаны):
1) Убедитесь, что оригинальные ссылки отсутствуют:
rm -rf . git/refs/original
2) Истечение всех записей в git-рефлоге:
git-рефлог истекает --all --expire='0 days'
3) Проверка старых упакованых ссылок
Это потенциально может быть сложно, в зависимости от того, сколько у вас упакованых ссылок. Я не знаю ни одной команды Git'а, которая бы это автоматизировала, так что, думаю, вам придётся сделать это вручную. Сделайте резервную копию .git/пакованных ссылок
. Теперь отредактируйте .git/packed-refs
. Проверьте старые ссылки (в частности, посмотрите, не упаковано ли какое-либо из ссылок из .git/refs/original
). Если вы нашли какие-то старые ссылки, которые не должны быть там, удалите их (удалите строку для этого ссылки).
После завершения очистки файла packed-refs
убедитесь, что git fsck
заметил недоступные объекты:
git fsck --full --unreachable
Если это сработало, и git fsck
теперь сообщает Вашему большому блоку, что он недоступен, Вы можете перейти к следующему шагу.
4) Переупаковка Вашего упакованного архива(ов)
git переупаковка -A -d
Это гарантирует, что недоступные объекты будут распакованы и останутся распакованы.
5) Обрезать недоступные (недоступные) объекты
git prune
И это должно сработать. У Git'а действительно должен быть лучший способ управления упакованными рефсами. Может быть, есть лучший способ, о котором я не знаю. В отсутствие лучшего способа ручное редактирование файла packed-refs
может быть единственным.
См.: Как удалить конфиденциальные файлы из истории Git
. Вышеуказанное не удалось, если файл не существует в Rev. В этом случае переключатель «-GIGNORE-Onlatch» исправит его:
git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch <filename>' HEAD
затем, чтобы получить все свободные объекты из репозидара:
git gc --prune='0 days ago'
У вас есть разные причины для неподвижного большой размер репозитория git после git gc
, поскольку он не удаляет все незакрепленные объекты .
Я подробно описываю эти причины в статье « уменьшить размер репозитория git »
Но один трюк, который нужно проверить в вашем случае, - это клонировать ваш «очищенный» репозиторий Git и посмотрите, имеет ли клон подходящего размера.
("очищенное" репо '- это то место, где вы применили filter-branch
, а затем gc
и обрезать
)