10.4. Packfiles

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

Packfiles

Добавим большой файл big.txt, который весит 20K И сделаем коммит.

У нас три объекта:

Они сжаты, поэтому большой весит всего . Посмотрим его несжатый размер:

$ git cat-file -s 48809b5dea28ec734ea7d0652a094c4fcf49d0b1 19772

Изменим маленько и снова закоммитим. Появилось ещё три объекта: новый блоб, новое дерево и новый коммит. Также заметим, что второй блоб такой же большой, как и первый:

Теперь вызовем GC:

Что стало с нашими объектами:

У меня не осталось обычных объектов. Остались бы только те, которые не помечены никаким коммитом (dangling — висящие), но у меня таких не было.

Получились файлы Pack, Index и Graph. Получившиеся файлы тоже сжатые, поэтому простым cat файлом их не прочитать. Но у гита есть для этого команды. Прочитаем индекс:

Видим айдишники шести объектов, их тип. Глазами вижу, что третий столбик похож на размер несжатого содержимого. Четвёртый — неужели сжатый размер?

Пятый — похоже на оффсет, смотрите:

  • первый начинается с 12 и плюс 142 байта содержимого;
  • получается, что следующий это 12 + 142 = 154 и плюс 101 байт сжатого содержимого;
  • это даёт, что третий начнётся с 154 + 101 = 255.

Внизу три строчки какой-то ещё информации.

Посмотрим на двух наших жирдяев, первого 48809 и второго 2acfd. Оказалось, что жирдяем остался только второй 2acfd, а первый 48809 усох до 9 несжатых байт.

Мануал объясняет это тем, что на практике нам скорее понадобится последняя версия, а предыдущая нужна реже, поэтому её Git будет вычислять, применяя диффы.

Что интересно, без разницы, какую из этих трёх команд вызывать: