2012-03-31 2 views
57

Я недавно побежал git fsck --lost-found в моем репозитории.git: dangling blobs

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

Тем не менее, я был удивлен, увидев, вероятно, более нескольких тысяч болтунов.

Я не верю, что что-то не так с моим хранилищем, но мне любопытно, что вызывает эти обвисшие капли? В хранилище работают только два человека, и мы не сделали ничего необычного.

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

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

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

ответ

49

Последний раз, когда я смотрел на это я наткнулся на this thread, а именно эта часть:

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

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

редактировать: Пер Даниилу, вы можете сразу собрать его, запустив

git gc --prune="0 days" 
+3

, что произойдет, если эти блоб являются удалить? – nferocious76

+0

@ nferocious76, то вы не можете спасти файлы, которые, например, были добавлены к постановке, но не были зафиксированы, а затем удалены (через rm -f). После запуска GC файлы теряются навсегда. –

+0

@DavidBrower Я вижу спасибо. Таким образом, он также удаляет несвязанные или незаписанные файлы. – nferocious76

16

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

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

+2

Стоит также отметить, что если вы исправите файл и переадресовываете его, предыдущий становится обвисшим блобом таким же образом. (Обычно я использую последовательность: hack away, 'git add',' git diff --cached' и/или 'git status' до тех пор, пока вы не будете счастливы, тогда' git commit', поэтому я получаю много таких. :-)) – torek

23

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

git gc --prune="0 days" 
Смежные вопросы