img

Что такое подмодули Git и как ими пользоваться?

21 ноября
20:00
Бесплатный вебинар
Введение в Docker
Ведущий — Филипп Игнатенко.
Руководитель центра разработки
Записаться
img
img

Подмодули 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

Теперь вы должны видеть изменения как в репозитории подмодуля, так и в родительском репозитории.

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
Программирование
Скидка 25%
Python-программист с нуля
Стань разработчиком на одном из самых популярных языков программирования.
Получи бесплатный
вводный урок!
Пожалуйста, укажите корректный e-mail
отправили вводный урок на твой e-mail!
Получи все материалы в telegram и ускорь обучение!
img
Еще по теме:
img
Гипервизор - это программное обеспечение для виртуализации, используемое для создания и запуска виртуальных машин (ВМ). Гипервиз
img
Виртуализация серверов позволяет запускать несколько виртуальных машин на одном физическом сервере. Запуск виртуальных машин (ВМ
img
Сегодня мы рассмотрим, как настроить и использовать PHP в проекте. Но прежде чем начать, нужно понять, что такое PHP. Что такое
img
Как разработчик, вы знаете, что HTML расшифровывается как HyperText Markup Language (язык разметки гипертекста). HTML — это язык
img
Бесконечные споры вокруг искусственного интеллекта приводят к путанице. Существует много терминов, которые кажутся похожими, но
img
SVG расшифровывается как масштабируемая векторная графика. Это веб-дружелюбный векторный формат файлов, используемый для отображ
21 ноября
20:00
Бесплатный вебинар
Введение в Docker