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.