Если вы клонировали Git-репозиторий на Mac и папки его подмодулей пусты, откройте Терминал, перейдите в репозиторий и выполните команду git submodule update --init --recursive. Это инициализирует подмодули, зафиксированные проектом, переключит их на коммиты, указанные родительским репозиторием, а также обработает вложенные подмодули. Вам понадобятся установленный Git и доступ к удаленному репозиторию каждого подмодуля.

Запустите команду инициализации в клонированном репозитории

Откройте Терминал и используйте cd, чтобы перейти в каталог, созданный командой git clone. Если имя каталога содержит пробелы, заключите его в кавычки, например:

cd "$HOME/Projects/My Project"
git submodule update --init --recursive

Замените пример пути на фактическое расположение вашего клона. Вы также можете ввести cd , перетащить папку репозитория из Finder в окно Терминала, чтобы вставить путь к ней, и нажать Return. В документации Apple Терминал описывается как интерфейс командной строки macOS, а zsh указан в качестве оболочки по умолчанию; приведенные выше команды используют стандартный синтаксис оболочки, который работает в zsh. Открытие и закрытие Терминала на Mac, Смена оболочки по умолчанию в Терминале на Mac

В официальной документации Git поясняется, что --init инициализирует еще не инициализированные подмодули, а --recursive также обновляет вложенные подмодули. Команда update получает недостающие коммиты и извлекает ревизию, ожидаемую родительским репозиторием. Документация git-submodule

Проверьте, были ли инициализированы подмодули

Чтобы увидеть, что зафиксировано в родительском репозитории, выполните:

git submodule status --recursive

В строке состояния подмодуля обычно отображаются идентификатор коммита и путь. Знак «минус» в начале означает, что подмодуль не инициализирован; знак «плюс» означает, что текущий извлеченный коммит отличается от коммита, зафиксированного в родительском репозитории; а U указывает на конфликт. Параметр рекурсивного статуса также выводит информацию о вложенных подмодулях. Документация git-submodule

Если в выводе перечислены пути со знаком «минус», выполните команду инициализации еще раз из корневого каталога репозитория. Если подмодули вообще не отображаются, проверьте, действительно ли текущий клон содержит файл .gitmodules и находитесь ли вы в нужном репозитории. В репозитории может не быть подмодулей, либо коммит, который вы клонировали, может их не содержать.

Разберитесь, какая ревизия извлекается

Подмодуль представляет собой самостоятельный Git-репозиторий, а родительский репозиторий фиксирует для него конкретный коммит. Обычное поведение команды update заключается в извлечении именно этого зафиксированного коммита, в результате чего подмодуль чаще всего оказывается в состоянии detached HEAD. Это нормально при настройке родительского проекта: так воспроизводится версия, выбранная родителем. Git — Подмодули, Документация git-submodule

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

Если команда завершилась с ошибкой

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

Если в проекте недавно изменился URL-адрес подмодуля, команда git submodule sync --recursive может синхронизировать локальную конфигурацию URL из .gitmodules; после этого выполните git submodule update --init --recursive. Git рекомендует команду sync для обновления конфигурации URL подмодулей, которые уже инициализированы или были только что добавлены. Документация git-submodule

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

Как только git submodule status --recursive начнет показывать ожидаемые идентификаторы коммитов без знаков «минус» в начале, зафиксированные репозиторием ревизии подмодулей можно считать успешно извлеченными. Продолжайте работу из родительского репозитория, если инструкции к проекту не требуют отдельной работы внутри подмодуля.

Источники