Мерзавец: свисающие капли
Я недавно побежал 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.