Мерзавец: свисающие капли

Я недавно побежал git fsck --lost-found в моем хранилище.

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

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

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

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

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

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

3 ответа

Решение

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

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

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

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

git gc --prune="0 days"

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

git gc --prune="0 days"

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

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

Другие вопросы по тегам