git submodules
Подмодули git.
Содержание
1 Общая информация
1.1 Прагматика
- Нужно включить сторонний код в проект.
- Простейший путь: скопировать код из git в свой проект.
- Недостатки этого подхода:
- смешивание нескольких проектов в один;
- после обновления стороннего проекта придётся вручную обновлять код.
- Общее правило в разработке программного обеспечения: держать отдельные вещи отдельно.
- Преимущества подмодулей git:
- обеспечивается согласованный интерфейс для подключения стороннего кода.
- Подмодули в git являются просто репозиториями git.
- Подмодуль помещается в родительский репозиторий git.
2 Операции с подмодулями
2.1 Добавление подмодуля
- Для добавления нового подмодуля используется команду
git submodule add
:git submodule add https://github.com/chaconinc/DbConnector
- Создаётся файл
.gitmodules
. Это конфигурационный файл, в котором хранится соответствие между URL проекта и локальным подкаталогом:[submodule "DbConnector"] path = DbConnector url = https://github.com/chaconinc/DbConnector
2.2 Клонирование проекта с подмодулями
- Можно сначала склонировать проект, а потом склонировать подмодули.
- Нужно выполнить команды:
git submodule init
: для инициализации локального конфигурационного файла;git submodule update
: для получения всех данных этого проекта и извлечения соответствующего коммита, указанного в основном проекте.
- Эти команды можно заменить одной:
git submodule update --init
илиgit submodule update --init --recursive
. - Можно склонировать сразу с подмодулями, использую опцию
--recurse-submodules
:git clone --recurse-submodules https://github.com/chaconinc/MainProject
2.3 Рекурсивное обновление подмодулей
- Обычно достаточно задать опцию
--recurse-submodules
при обновлении:git pull --recurse-submodules
- В более сложных случаях для обновления подмодулей можно использовать следующие команды:
git submodule init git submodule update git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'
- При этом подмодули автоматически сразу устанавливается в
HEAD
.