Я случайно добавил, зафиксировал и отправил огромный двоичный файл с моей последней фиксацией в репозиторий Git.
Как я могу заставить Git удалить объект (ы), который был / был создан для этого коммита, чтобы мой .git
каталог снова уменьшился до нормального размера?
Изменить : Спасибо за ваши ответы; Я пробовал несколько решений. Ни один не работал. Например, тот, что был на GitHub, удалил файлы из истории, но .git
размер каталога не уменьшился:
$ BADFILES=$(find test_data -type f -exec echo -n "'{}' " \;)
$ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $BADFILES" HEAD
Rewrite 14ed3f41474f0a2f624a440e5a106c2768edb67b (66/66)
rm 'test_data/images/001.jpg'
[...snip...]
rm 'test_data/images/281.jpg'
Ref 'refs/heads/master' was rewritten
$ git log -p # looks nice
$ rm -rf .git/refs/original/
$ git reflog expire --all
$ git gc --aggressive --prune
Counting objects: 625, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (598/598), done.
Writing objects: 100% (625/625), done.
Total 625 (delta 351), reused 0 (delta 0)
$ du -hs .git
174M .git
$ # still 175 MB :-(
git-repack -a
за которым следует,git-prune-packed
например. См. Blog.felipebalbi.com/2007/12/19/…filter-branch
,gc
,repack
...), нет, вы не должны видеть любой плохой фиксации на всех. Это признак того, что уборка прошла не так, как ожидалось.Ответы:
Я ответил на это в другом месте и скопирую здесь, так как горжусь этим!
... и без лишних слов, могу я представить вам этот полезный скрипт git-gc-all, который гарантированно удалит весь ваш git-мусор до тех пор, пока не появятся дополнительные переменные конфигурации:
git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 \ -c gc.rerereresolved=0 -c gc.rerereunresolved=0 \ -c gc.pruneExpire=now gc "$@"
Может оказаться полезным параметр --aggressive.
ПРИМЕЧАНИЕ: это удалит ВСЕ элементы, на которые нет ссылок, так что не приходите ко мне со слезами на глазах, если вы позже решите, что хотите сохранить некоторые из них!
Вам также может потребоваться сначала запустить что-то подобное, о боже, git - это сложно !!
git remote rm origin rm -rf .git/refs/original/ .git/refs/remotes/ .git/*_HEAD .git/logs/ git for-each-ref --format="%(refname)" refs/original/ | xargs -n1 --no-run-if-empty git update-ref -d
Я записал все это в скрипт, вот здесь:
http://sam.nipl.net/b/git-gc-all-ferocious
источник
xargs
команда выдает ошибку в OS X из-за нераспознанной опции. Самое простое решение: установите GNU xargs через homebrewbrew install findutils
и заменитеxargs
наgxargs
.Ваш
git reflog expire --all
неверен. Он удаляет записи журнала ссылок, которые старше, чем время истечения срока действия, которое по умолчанию составляет 90 дней. Используйтеgit reflog expire --all --expire=now
.Мой ответ на аналогичный вопрос касается проблемы действительно очистки неиспользуемых объектов из репозитория.
источник
1) Удалите файл из репозитория git (а не файловую систему):
git rm --cached path/to/file
2) Уменьшите репо, используя:
git gc
,или
git gc --aggressive
git prune
или комбинация вышеперечисленного, как предлагается в этом вопросе: уменьшить размер репозитория git
источник
Это руководство по удалению конфиденциальных данных может применяться с использованием того же метода. Вы будете переписывать историю, чтобы удалить этот файл из каждой ревизии, в которой он присутствовал. Это деструктивно и вызовет конфликты репо с любыми другими извлечениями, поэтому сначала предупредите всех соавторов.
Если вы хотите, чтобы двоичный файл был доступен в репо для других людей, тогда нет реального способа делать то, что вы хотите. Это почти все или ничего.
источник
Ключ для меня оказался запущен,
git repack -A -d -f
а затемgit gc
уменьшен размер единственного пакета git, который у меня был.источник
Эй!
Git получает только те объекты, которые ему действительно нужны, при клонировании репозиториев (если я правильно понимаю)
Таким образом, вы можете исправить последнюю фиксацию, удалив файл, добавленный по ошибке, а затем отправить свои изменения в удаленный репозиторий (с параметром -f, чтобы перезаписать старую фиксацию на сервере)
Затем, когда вы создаете новый клон этого репо, его каталог .git должен быть таким же маленьким, как и до фиксации большого файла (ов).
При желании, если вы также хотите удалить ненужные файлы с сервера, вы можете удалить репозиторий на сервере и отправить новую клонированную копию (с полной историей)
источник
См. «Удаление объектов» в книге Pro Git:
http://git-scm.com/book/en/Git-Internals-Main maintenance-and-Data-Recovery#Removing-Objects
Обновление: см. Также BFG repo cleaner: http://rtyley.github.io/bfg-repo-cleaner/
источник
Не забудьте изменить
Filename
тот, который хотите удалить из репозитория.источник
В 2020 году документация для git-filter-branch не поощряет его использование и рекомендует использовать альтернативу, такую как git-filter-repo . Также может использоваться вместо BFG. .
Обратите внимание, что глава о перезаписи истории в книге git не обновлялась. Также нет рекомендаций GitHub по удалению конфиденциальных данных.
источник