2010-09-26 4 views
66

Я случайно добавил, зафиксировал и нажал огромный двоичный файл с моей самой последней фиксацией в репозиторий Git.Как удалить неиспользуемые объекты из репозитория 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 :-(
+9

Просто напоминание для модераторов, этот вопрос 100% принадлежит на SO, не суперпользователь. – VonC

+0

См. Также http://stackoverflow.com/questions/2116778/reduce-git-repository-size/2116892#2116892 и http://stackoverflow.com/questions/685319/git-pull-error-unable-to-create -temporary-sha1-filename/685422 # 685422 – VonC

+0

Как упоминалось здесь (http://stackoverflow.com/questions/685319/git-pull-error-unable-to-create-temporary-sha1-filename/685422#685422), вы пытались переупаковать после вашего gc? 'git-repack -a ', например,' git-prune-packed'. См. Http://blog.felipebalbi.com/2007/12/19/housekeeping-your-git-repository/ – VonC

ответ

9

Это руководство по removing sensitive data можно применять, используя тот же метод. Вы будете переписывать историю, чтобы удалить этот файл из каждой версии, в которой он присутствовал. Это разрушительно и вызовет конфликты репо с любыми другими проверками, поэтому сначала предоставьте кому-либо соавторов.

Если вы хотите сохранить двоичный файл в репо для других людей, тогда нет реального способа сделать то, что вы хотите. Это почти все или ничего.

22

Неверный номер git reflog expire --all. Он удаляет записи журнала, которые старше, чем время истечения срока действия, которое по умолчанию составляет 90 дней. Используйте git reflog expire --all --expire=now.

My answer к аналогичному вопросу относится к проблеме действительно чистки неиспользуемых объектов из репозитория.

5

Hy!

Git получает только объекты, которые он на самом деле нужно при клонировании репозиториев (если я правильно понимаю)

Таким образом, вы можете изменить последний коммит удалив файл добавлен по ошибке, а затем нажмите ваши изменения в удаленном хранилище (с - f для перезаписывания старой фиксации на сервере тоже)

Затем, когда вы создаете новый клон этого репо, это .git-каталог должен быть таким же маленьким, как перед большим файлом.

При желании, если вы хотите, чтобы удалить ненужные файлы с сервера тоже можно удалить хранилище на сервере и толкать вновь клонированной копии (то есть полная история)

3
git filter-branch --index-filter 'git rm --cached --ignore-unmatch Filename' --prune-empty -- --all 

Не забудьте изменить Filename для той, которую вы хотите удалить из репозитория.

93

Я ответил на это в другом месте и копирую здесь, так как я горжусь этим!

... и без лишних слов, позвольте представить вам этот полезный скрипт, ГИТ-дс-все, гарантированно удалить все ваши GIT мусор, пока они не могли бы придумать дополнительные переменные конфигурации:

git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 \ 
    -c gc.rerereresolved=0 -c gc.rerereunresolved=0 \ 
    -c gc.pruneExpire=now gc "[email protected]" 

Возможно, будет полезен параметр -агрессивный.

ПРИМЕЧАНИЕ: это приведет к удалению ВСЕХ необоснованных предметов, поэтому не плачьте мне, если позже вы решите, что хотите сохранить некоторые из них!

Возможно, вам также понадобится запустить что-то вроде этого сначала, о, дорогая, 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

+0

Как и в http : //stackoverflow.com/questions/1904860/how-to-remove-unreferenced-blobs-from-my-git-repo/14728706#comment20614863_14728706, +1 к вам снова. – VonC

+10

отлично: D мой злой план получить больше очков путем клонирования ответов сработал !! 1;) –

+0

Да! Это сработало, но мне пришлось запустить полный скрипт. Недостаточно выполнения только команды gc (с настройками конфигурации). – Daniel

11

1) Удалить файл из мерзавца репо (& не файловой системы):

  • git rm --cached path/to/file

2) Термоусадочные репозиторий с помощью:

  • git gc,

  • или git gc --aggressive

  • или git prune

или комбинацию из указанных выше, как предложено в этом вопросе: Reduce git repository size

+0

'git gc' работал для меня! –

6

Ключ для меня tu выработали git repack -A -d -f, а затем git gc, чтобы уменьшить размер единственного пакета git, который у меня был.

Смежные вопросы