Перейти к содержанию

Git-подмодули

Что такое подмодуль

Подмодуль (submodule) — это отдельный Git-репозиторий, подключённый внутрь вашего основного репозитория (далее — суперпроект) как зависимость. В суперпроекте хранится ссылка на конкретный коммит подмодуля (а не его файлы). Такой подход обеспечивает стабильность и предсказуемость совместной работы с подмодулями проекта.

Применение:

  • общие библиотеки и шаблоны, переиспользуемые в нескольких проектах;
  • «вендоринг» внешних репозиториев без копирования файлов.

Добавление подмодулей

# В корне проекта
git submodule add https://gitflic.ru/project/user/repo.git path/to/submodule
git add .gitmodules path/to/submodule
git commit -m "Добавлен подмодуль <submodule>"

В репозитории появится:

  • файл .gitmodules — хранит путь, URL и ветку.
  • ссылка (gitlink) на коммит подмодуля в основном репозитории.

Пример .gitmodules:

[submodule "submodule"]
    path = path/to/submodule
    url = https://gitflic.ru/project/user/repo.git
    branch = master

Клонирование подмодулей

Клонирование проекта включая подмодули

git clone --recurse-submodules https://gitflic.ru/project/user/repo.git

Если ранее проект был склонирован без подмодулей

git submodule update --init --recursive

Клонирование подмодулей на последние изменения из ветки

Чтобы при инициализации подмодули обновлялись не на зафиксированный коммит, а на последний коммит ветки, указанной в .gitmodules, используйте команду:

git submodule update --init --recursive --remote

Обновление подмодулей

Автоматически (на последний коммит ветки)

git submodule update --remote --recursive
git commit -am "Обновлен подмодуль"

Вручную (на конкретный коммит или тег)

cd path/to/submodule
git fetch
git checkout <commit-or-tag>
cd ../..
git add path/to/submodule
git commit -m "Зафиксирован новый коммит подмодуля"

Удаление подмодулей

git submodule deinit -f path/to/submodule
git rm -f path/to/submodule
rm -rf .git/modules/submodule
git commit -m "Удален подмодуль"

Дополнительные настройки

Автоматическое управление подмодулями в суперпроекте

git config --global submodule.recurse true

Синхронизация измененного URL

Если вы поменяли URL в .gitmodules вручную — выполните:

git submodule sync --recursive

Shallow-обновление для ускорения работы

git submodule update --init --recursive --depth 1

Опция --depth 1 клонирует подмодули только с последним коммитом, без всей истории. Это значительно экономит место и время при клонировании, особенно в CI/CD.


Основные команды

Действие Команда
Добавить подмодуль git submodule add <url> <path>
Клонировать с подмодулями git clone --recurse-submodules <url>
Инициализация git submodule update --init --recursive
Обновить git submodule update --remote --recursive
Удалить git submodule deinit -f <path> && git rm -f <path>

Для работы с подмодулями в GitFlic CI/CD обратитесь к данной статье