Я думаю (я не уверен), что это деталь реализации подмодулей.Если репозиторий добавлен в репозиторий (с использованием git add), то сохраняется не содержимое каталога, а хэш фиксации HEAD (в виде коммита типа, а не в виде дерева типов или большого двоичного объекта).Этот хеш коммита содержит всю информацию, которая вам нужна, если у вас есть вспомогательный репозиторий.Но если у вас есть только супер-репозиторий и хеш коммитов HEAD суб-репозитория, вам все равно нужно получить суб-репозиторий.Эта информация хранится в файле .gitmodules.Если вы вообще не используете пульты дистанционного управления, если вы никогда не клонируете, не перемещаете и не извлекаете свой супер-репозиторий, вы можете использовать субмодули без .gitmodules.Просто добавьте вспомогательные репозитории (например, сторонние библиотеки) в свой репозиторий.Это позволяет отслеживать, какие версии сторонних библиотек использовались для каждого коммита в супер-хранилище.Но это не позволяет клонировать все сразу.Удаленные объекты вложенных репозиториев хранятся только в клонах в рабочем дереве.Если вы отправите супер-репозиторий (в пустой репозиторий), информация о том, где взять субмодули, будет потеряна.
Чтобы понять, как это работает cat-file
- очень полезный инструмент, чтобы взглянуть наодиночные объекты git .Коммит содержит сообщение, автора, комитера и обычно ссылку на объект дерева:
$ git cat-file -p 218f61f0ae29941edcc594bde692145f7f1177cc
tree 916a626892af1cd59ff84c3b7d351fca12712806
author lumbric <not-real-adress@gmail.com> 1513291656 +0100
committer lumbric <not-real-adress@gmail.com> 1513291690 +0100
Commit message in the super repository
Объект дерева содержит список других объектов git:
$ git cat-file -p 916a626892af1cd59ff84c3b7d351fca12712806
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 b
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 c
040000 tree 765b32c65d38f04c4f287abda055818ec0f26912 folder_a
160000 commit 77e2f79e6401f28cab5cf4ca62bb0d58c945f823 sub_repo1
Папки хранятся какдревовидные объекты (содержащие опять-таки множество объектов git) и файлы в виде BLOB-объектов.Подмодуль хранится в виде коммита типа в объекте дерева.Содержимое можно найти в данном хеше в под-хранилище.
С man git-submodule
:
Подмодули состоят из так называемой записи дерева ссылок в главном репозитории, котораяотносится к конкретному объекту фиксации во внутреннем репозитории, который является полностью отдельным.Запись в файле .gitmodules (см. Gitmodules (5)) в корне дерева исходного кода присваивает субмодулю логическое имя и описывает URL-адрес по умолчанию, с которого клонируется субмодуль.Логическое имя может использоваться для переопределения этого URL в конфигурации вашего локального репозитория (см. Init субмодуля).