Почему `git clone --length 1` оставляет паковочные файлы?

Я пытаюсь клонировать репозиторий с большим количеством 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.

Это началось с вопроса о мелких подмодулях и загрузке файлов только при определенном коммите без накладных расходов, но накладные расходы на паковочные файлы, похоже, относятся к клонированию в целом, поэтому я решил начать здесь.


52
1

Ответ:

Решено

Проверка файла пакета с помощью 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

Интересные вопросы для изучения

Как устранить ошибку «Необходимо указать, как согласовать расходящиеся ветки» при перебазировании в Git?Git-фильтр-репо не удаляет файл из истории коммитовНекоторые конвейеры сборки ADO отображают все рабочие элементы в связанных элементах, а другие — только соответствующие элементы. Ищем идеиКак удалить подключение репозитория git и github к решению в Visual Studio 2022?Считается ли вредным помещение параметра конфигурации Git «user.signingKey» под контроль версий?Ошибка конфигурации безопасности при обновлении версии приложения весенней загрузки с 2.x.x до 3.3.0Я хочу отменить изменения в идентификаторе фиксации, а затем зафиксировать эти откатные изменения как новую фиксацию в GITК чему относится ошибка «модуль langchain» не имеет атрибута «verbose»?Восстановить изменения Git, которые не были добавлены в индекс или зафиксированыЛокальное хранение в Git: нужно ли мне еще нажимать?