мерзавец: свисающие капли - PullRequest
60 голосов
/ 31 марта 2012

Я недавно запустил git fsck --lost-found в своем хранилище.

Я ожидал увидеть пару свисающих коммитов, где я сбросил HEAD.

Однако, я был удивлен, увидев, вероятно, более нескольких тысяч сообщений висячих больших двоичных объектов.Я не верю, что что-то не так с моим хранилищем, но мне любопытно, что является причиной этих висячих сгустков?Над хранилищем работают только два человека, и мы не сделали ничего необычного.

Я бы не подумал, что они были созданы старой версией файла, заменяемой новой, посколькуgit нужно будет удерживать оба больших двоичных объекта, чтобы он мог отображать историю.

Если подумать, в какой-то момент мы добавили в проект ОЧЕНЬ большой каталог (тысячи файлов) по ошибке, а затем удалили его,Может ли это быть источником всех висящих сгустков?

Просто ищу понимание этой тайны.

Ответы [ 3 ]

51 голосов
/ 31 марта 2012

В прошлый раз, когда я смотрел на это, я наткнулся на эту тему , в частности на эту часть:

Вы также можете получить висящие предметы в пачках. Когда этот пакет перепакованный, эти объекты будут ослаблены, а затем в конечном итоге истек в соответствии с правилом, упомянутым выше. Тем не менее, я считаю, что gc не всегда переупаковывать старые пакеты; он будет делать новые пакеты, пока у вас не будет много пакетов, а затем объединить их все (по крайней мере, так будет делать "gc --auto"; не помните, следует ли «git gc» тому же правилу).

Так что это нормальное поведение, и, в конце концов, его собирают, я думаю.

edit: За Даниэля вы можете сразу же собрать его, запустив

git gc --prune="0 days"
24 голосов
/ 11 июня 2013

Я был очень нетерпелив и использовал:

git gc --prune="0 days"
16 голосов
/ 31 марта 2012

Всякий раз, когда вы add добавляете файл в индекс, содержимое этого файла добавляется в объектную базу данных Git в виде большого двоичного объекта. Когда вы затем reset / rm --cached этот файл, большие двоичные объекты все еще будут существовать (они будут собирать мусор при следующем запуске gc)

Однако, когда эти файлы являются частью коммита, и вы решаете позже reset историю, тогда старые коммиты все еще доступны из Git reflog и будут собирать мусор только через некоторое время (обычно через месяц, iirc). ). Эти объекты не должны отображаться как висячие, так как на них все еще есть ссылки из reflog.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...