2015-01-05 3 views
2

Гипотетическая ситуация: У меня есть репозиторий, у меня есть индекс, голова, рефов, упакованного-рефов и т.д. я не знаю имена файлов пакета в .git/объектов/пакетКак git знает имя файла пакета sha1?

Как git определяет имя файла пакета? Есть ли способ вычислить имя файла пакета из индексного файла?

Обновление: .git/objects/info/packs является ближайшим Я собираюсь добраться до того, что я ищу. Однако этот файл не всегда присутствует.

ответ

4

Как правило, git просто считывает содержимое каталога objects/pack: он не знает априори, какие будут значения SHA-1 файла пакета. Однако, когда он делает файл new, он вычисляет SHA-1 и использует его для имени файла пакета; и имя индекса обязательно совпадает с именем пакета-файла, так что если

objects/pack/pack-1713881825f0238230418a7f843a8c9af9b70eea.pack 

существует, то

objects/pack/pack-1713881825f0238230418a7f843a8c9af9b70eea.idx 

также должны существовать, например (эти имена, найденные глядя в каталоге нет особого значения для этих SHA-1).

Также могут быть .keep и .bitmap файлы, соответствующие любому SHA-1 (растровые изображения выглядят новыми в git 2.0.0).

Для более забавного просветления на вьючные файлах см

Documentation/technical/pack-heuristics.txt 

в источнике мерзавца. :-)

+0

Наконец-то выдумал что-то. Список всех файлов пакета (иногда?) Находится в .git/objects/info/packs, что на самом деле было тем, что я искал. Просто хотел дать обновление. –

+0

Это определенно «иногда» (не «всегда»), поскольку этот каталог существует, но пуст в нескольких git-репозициях, которые я проверил (и не пуст в других). 'Documentation/gitrepository-layout.txt' говорит, что это специально для немых транспортов, но см. Также' git help repository-layout', который упоминает 'git repack' как его создание. – torek

+0

Да, я так много думал, но, похоже, лучший вариант, который у меня есть, к сожалению. Вычисление пакета SHA без доступа к диску кажется невозможным (или, по крайней мере, очень тяжелым) из моего понимания. –

Смежные вопросы