Git submodule: добавить, клонировать и обновить подмодули
Подмодуль в Git это ссылка на конкретный коммит другого репозитория внутри вашего. Добавить его можно командой git submodule add адрес путь, а клонировать проект вместе с подмодулями командой git clone --recurse-submodules.
Добавить подмодуль
git submodule add https://github.com/user/library.git libs/library
git commit -m "Добавить подмодуль libs/library"Git скачает репозиторий в libs/library, создаст файл .gitmodules и запишет в индекс не файлы подмодуля, а ссылку на его коммит. В .gitmodules попадёт такая запись:
[submodule "libs/library"]
path = libs/library
url = https://github.com/user/library.gitКлонировать проект с подмодулями
git clone --recurse-submodules https://github.com/user/project.gitЕсли репозиторий уже склонирован без этого флага, папки подмодулей будут пустыми. Заполните их:
git submodule update --init --recursiveОбновить подмодуль
Есть два разных действия. Первое подтягивает ту версию, которую записал автор проекта:
git pull --recurse-submodules # забрать изменения проекта и обновить подмодули
git submodule update --recursive # выставить подмодули на записанные коммитыВторое переводит подмодуль на последний коммит его собственной ветки:
git submodule update --remote libs/library
git add libs/library # зафиксировать новый коммит подмодуля в проекте
git commit -m "Обновить libs/library"Посмотреть состояние
git submodule status # первый символ: - не загружен, + коммит отличается, пробел всё совпадает
git config submodule.recurse true # включить обработку подмодулей для pull, checkout и других командУдалить подмодуль
В Git нет одной команды для удаления, нужны четыре шага:
git submodule deinit -f libs/library
git rm -f libs/library
rm -rf .git/modules/libs/library
git commit -m "Удалить подмодуль libs/library"Частые вопросы
Почему подмодуль «detached HEAD»?
Подмодуль привязан к конкретному коммиту, а не к ветке. Чтобы внести в него правки, перейдите в папку подмодуля и выполните git switch main, затем коммитьте как в обычном репозитории.
Почему коллеги не видят мои изменения в подмодуле?
Нужно отправить два репозитория: сначала сам подмодуль (git push внутри его папки), потом основной проект с новой ссылкой на коммит.