Подмодули Git – это способ добавления одного репозитория Git в качестве подкаталога другого репозитория. Такая вложенная структура исходного кода может оказаться довольно полезной в проектах, где нужен более точный контроль над зависимостями и процессом сборки. Кроме того, эта структура довольно проста с точки зрения создания.
Для чего нужны подмодули?
Когда вы добавляете подмодуль в репозиторий Git, вы фактически создаете связь между двумя репозиториями. Основной репозиторий и репозиторий подмодуля могут обновляться независимо друг от друга. Родительский репозиторий будет содержать удаленный URL, а также ссылку на полученный ID коммита в истории подмодуля. Кроме того, при клонировании родительского модуля, подмодули также будут клонироваться.
Это может оказаться довольно полезным, особенно если у вас есть проект, который зависит от кода другого проекта, и вы хотите, чтобы эти проекты (и их истории версий) хранились отдельно, но при этом вы могли бы легко работать с ними обоими.
Основной аналог подмодулей – это менеджеры пакетов, например, NPM, NuGet или Maven. Менеджеры пакетов предоставляют централизованный репозиторий, в котором хранятся пакеты и библиотеки, которые вы можете легко установить и обновить. Но при этом вы обязаны огласить конкретную версию каждого пакета, который намерены использовать. А если ваш код не является общедоступным, то вы должны использовать свой собственный частный реестр пакетов.
Подмодули Git, в отличие от большинства менеджеров пакетов, позволят вам более тщательно управлять зависимостями. С помощью подмодулей вы можете однозначно выбрать, какие версии зависимостей вы хотите добавить в свой проект. Кроме того, куда как проще обновить ID коммита, чем публиковать новый пакет.
Помимо всего прочего, подмодули упрощают сопровождение и использование ответвлений общих библиотек, и это то, что выбирают многие компании, когда им нужен дополнительный функционал и настройка. В конце концов, если вы сопровождаете репозиторий для модуля и вам необходим очень точный контроль над вашими зависимостями, то вы вполне можете рассмотреть подмодули в качестве альтернативы менеджерам пакетов.
Как пользоваться подмодулями Git?
Если вы клонируете репозиторий, который использует подмодули, то считайте, что большую часть работы за вас уже сделали. Ваш клиент Git должен также автоматически клонировать репозиторий подмодуля, а также обновлять его каждый раз, когда другие специалисты по сопровождению вносят изменения в подмодуль.
Если же это не так, то вам нужно запустить команду
git clone
с флагом
--recursive
который просканирует и обновит все подмодули.
Процесс добавления нового подмодуля довольно простой. Если вы пытаетесь добавить новый подмодуль из репозитория исходного кода, то вам нужно просто запустить команду git submodule add:
git submodule add URL submodule_directory
Эта команда загрузит репозиторий подмодуля, находящийся по указанному URL-адресу, и клонирует его в папку submodule_directory.
Но если вы хотите преобразовать уже существующую папку, то процесс будет немного сложнее. Процесс клонирования включает в себя повторное клонирование вашего основного репозитория, фильтрацию истории коммитов для того, чтобы добавить только каталог модуля, и отправку подмодуля в новый репозиторий.
После того, как вы добавите подмодуль, вам нужно будет зафиксировать изменения в родительском репозитории. Таким образом, вы обновите конфигурацию для всех тех, кто будет извлекать этот родительский репозиорий.
git commit -m "Added submodule submodule_directory"
Обновление подмодулей Git
Если кто-то другой обновил подмодуль или вам необходимо получить обновления из репозитория подмодуля, то вам нужна команда git submodule update:
git submodule update --remote
Но если вам самим нужно внести изменения, здесь все гораздо сложнее. Внесение изменений в код в подмодулях Git требует гораздо большей осторожности, нежели обновление кода в обычном репозитории Git. В целом, у вас есть два варианта:
- Вы можете внести изменения в отдельный репозиторий для подмодуля и в обычном порядке зафиксировать и обновить их. А для того, чтобы получить новые изменения, вам нужно будет запустить команду git submodule update в родительском репозитории.
- Вы можете внести изменения в родительский репозиторий. А так как подмодуль – это, по сути, встроенный репозиторий Git, то вы можете перейти в каталог подмодуля с помощью команды cd и запускать команды Git в обычном порядке. Это одно из основных преимуществ подмодулей – у вас есть возможность сопровождать отдельные репозитории, работая и там, и там.
Если вы вносите изменения внутри родительского репозитория, то вы должны перейти в подмодуль с помощью команды cd и обновить его:
cd submodule_dirgit commit -am "submodule commit"git push
После чего вы должны вернуться в родительский репозиторий и отправить в него обновления подмодуля:
cd ..git commit -am "updated submodule"git push
Теперь вы должны видеть изменения как в репозитории подмодуля, так и в родительском репозитории.