Подмодуль - это ссылка на другой Git-репозиторий внутри вашего проекта. Удобно, когда нужно использовать внешнюю библиотеку или общий код, но держать его в отдельном репозитории.
💡 Подмодуль хранит не код, а ссылку на конкретный коммит внешнего репозитория.
Добавить подмодуль
# Добавить репозиторий как подмодуль в указанную папку
git submodule add <URL> <путь/куда/положить>
# Пример
git submodule add https://github.com/luizdepra/hugo-coder.git themes/hugo-coder
# Зафиксировать изменения
git commit -m "Add submodule: themes/hugo-coder"
git push
После этого в проекте появятся:
- Файл
.gitmodules- конфигурация подмодулей - Папка с подмодулем - как ссылка на внешний репозиторий
Клонировать проект с подмодулями
# Вариант 1: сразу с подмодулями
git clone --recursive <URL>
# Вариант 2: если уже склонировали без подмодулей
git submodule update --init --recursive
Обновить подмодуль
# Зайти в подмодуль и подтянуть изменения
cd themes/hugo-coder
git pull origin main
# Вернуться в корень и зафиксировать новый коммит подмодуля
cd ../..
git add themes/hugo-coder
git commit -m "Update submodule: hugo-coder"
git push
Или одной командой из корня:
# Обновить все подмодули до последних коммитов удалённых веток
git submodule update --init --recursive --remote
# Зафиксировать изменения ссылок
git add .
git commit -m "Update all submodules"
git push
⚠️
--remoteтянет последние коммиты из удалённых репозиториев. Без него - только те коммиты, что уже зафиксированы в.gitmodules.
Удалить подмодуль
# 1. Деинициализировать подмодуль
git submodule deinit -f themes/hugo-coder
# 2. Удалить из индекса и рабочей директории
git rm -f themes/hugo-coder
# 3. Удалить служебные данные (опционально, но рекомендуется)
rm -rf .git/modules/themes/hugo-coder
# 4. Зафиксировать изменения
git commit -m "Remove submodule: themes/hugo-coder"
git push
Полезные команды
# Показать статус всех подмодулей
git submodule status
# Показать, какие коммиты ждут обновления
git submodule foreach 'git log -1 --oneline'
# Синхронизировать URL подмодулей (если изменился remote)
git submodule sync --recursive
# Выполнить команду во всех подмодулях
git submodule foreach 'git fetch'
Частые проблемы
# Подмодуль пустой после clone
→ git submodule update --init --recursive
# Ошибка "fatal: not a git repository" внутри подмодуля
→ Удалите папку подмодуля и выполните:
git submodule update --init
# Конфликт версий подмодуля при мердже
→ Выберите нужную версию коммита:
git add themes/hugo-coder
git commit -m "Resolve submodule conflict"