(вирішено, див. нижню частину корпусу питання)
Шукаю це вже давно, і я маю до цього часу:
- http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/ та
- http://progit.org/book/ch9-7.html
Приблизно той самий метод, але обидва вони залишають об'єкти у файлах пакунків ... Застрягли.
Що я спробував:
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 :(
РІШЕННЯ: Це найкоротший спосіб позбутися файлів:
- перевірте .git / packed-refs - моя проблема полягала в тому, що у мене був
refs/remotes/origin/master
рядок для віддаленого сховища, видаліть його, інакше git не видалить ці файли - (необов’язково)
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/
- видалити резервну копію gitgit reflog expire --all --expire='0 days'
- закінчити термін дії всіх вільних предметівgit fsck --full --unreachable
- перевірити, чи немає вільних предметівgit repack -A -d
- перепакуванняgit prune
- остаточно видалити ці предмети