Я пытаюсь клонировать репозиторий с большим количеством BLOB-объектов в его истории и хотел бы загружать файлы только при определенном коммите без каких-либо дополнительных затрат или избыточности.
При попытке git clone --depth 1
каталог .git
становится довольно большим. Похоже, это связано с большим пакетным файлом, размер которого соответствует размеру, сообщаемому git, когда он равен Receiving objects:
. Проверка пак-файла с помощью git verify-pack
предполагает, что он содержит большое количество информации о больших двоичных объектах.
Однако попытка git clone --filter=blob:none
по-прежнему приводит к получению таких же больших BLOB-объектов со списком пакетных файлов.
Я ожидаю, что --depth 1
не должен загружать какую-либо историю, а filter=blob:none
не должен загружать историю больших двоичных объектов.
Так почему же мой каталог .git
заполняется служебными файлами Packfile для поверхностного клона?
Мне интересно, возможно, это первоначальная сжатая загрузка единственного коммита, который я проверил, - но даже в этом случае, как я могу предотвратить сохранение этого избыточного файла?
Для справки: репозиторий, который я клонирую: ARM-software/CMSIS_5.
Это началось с вопроса о мелких подмодулях и загрузке файлов только при определенном коммите без накладных расходов, но накладные расходы на паковочные файлы, похоже, относятся к клонированию в целом, поэтому я решил начать здесь.
Проверка файла пакета с помощью gitverify-pack показывает, что он содержит большое количество информации о больших двоичных объектах.
Когда ты бежишь...
git clone --filter blob:none --depth 1 https://github.com/ARM-software/CMSIS_5
... вы все еще извлекаете рабочую копию из репозитория. В рассматриваемом репозитории содержится более 3000 файлов:
$ find * -type f -print | wc -l
3225
Поскольку содержимое файла хранится в больших двоичных объектах, это означает, что независимо от фильтра blob:none
, git
все равно потребуется передавать большие двоичные объекты, соответствующие файлам в коммите HEAD, поэтому мы ожидаем увидеть аналогичную величину больших двоичных объектов в паковочных файлах. И действительно, после выполнения приведенной выше команды мы видим:
$ git verify-pack -v .git/objects/pack/pack-b0279f34420775288c089456dfc84f2697570837.pack |
grep blob | wc -l
2807
Если вы не извлекаете рабочую копию (например, клонируете с помощью --bare
), результирующий репозиторий не будет содержать никаких больших двоичных объектов:
$ git clone --bare --filter blob:none --depth=1 https://github.com/ARM-software/CMSIS_5/
$ find CMSIS_5.git/objects/pack/ -name '*.pack' | xargs -n1 git verify-pack -v | grep blob | wc -l
0