Git: оборванные капли

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

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

Однако, я был удивлен, увидев, вероятно, более чем несколько тысяч болтающихся сообщений blob.

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

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

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

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

Ответ 1

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

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

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

edit: Per Daniel, вы можете сразу собрать его, запустив

git gc --prune="0 days"

Ответ 2

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

git gc --prune="0 days"

Ответ 3

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

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