Как удалить неиспользуемые объекты из репозитория git?



4 Answers

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

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

git file object binary

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



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

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




Hy!

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

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

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

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







Related