Перейти к содержанию

Git: работа с подмодулями

Как можно прочитать, один репозиторий можно сделать подмодулем другого, например в целях использования в качестве библиотеки.

Сначала нужно добавить подмодуль в текущий репозиторий:

git submodule add URL

После этого добавленный репозиторий (подмодуль) будет размещен в директории со своим именем, а также будет создан файл .gitmodules в котором будут сохранены сведения о подмодуле и других подмодулях, если вы их также добавите.

Если после добавления подмодуля сразу выполнить git status, то вы увидите, что в индекс уже были добавлены указанный файл и директория подмодуля. Теперь можно сделать коммит и эти изменения попадут в текущий репозиторий.

Примечание: если вы добавите в качестве подмодуля пустой репозиторий, он не будет добавлен в индекс, т.к. просто нечего добавлять.

Если после добавления подмодуля внести изменения в его файлы, Git в текущем репозитории будет указывать на изменения, но добавлять их в индекс не будет. Чтобы фиксировать изменения в подмодуле, нужно переходить в его директорию и работать там как с обычным репозиторием, только как бы вложенным.

После того как вы зашли в директорию подмодуля, добавили изменения в индекс, затем выполнили там же коммит, вы можете сделать push и изменения в подмодуле будут загружены на сервер.

Далее, вы можете выйти из директории подмодуля в директорию основного проекта, добавить в индекс директорию, выполнить коммит и также отправить изменения на сервер.

Обратите внимание, что если вы изменили что-то в файлах подмодуля, но не выполнили коммит, то в основном проекте вы также не сможете сделать коммит. Если же вы выполнили коммит в подмодуле, но не отправили изменения на сервер, то выполнив push в основном проекте, вы отправите на сервер ссылку на последний коммит в подмодуле (а он еще не отправлен на сервер).

Проще говоря, самый простой и понятный способ работы с подмодулями - это выполнять работы с учетом необходимости синхронизации изменений: сначала меняете что-то в подмодулях, затем меняете что-то в основном репозитории.

Есть особенность при клонировании репозитория, содержащего подмодули. После клонирования директории подмодулей будут пусты. Чтобы получить подмодули, нужно выполнить:

git submodule init
git submodule update

либо более короткий вариант - добавьте опцию --recurse-submodules при клонировании.

Если подмодули загружаются из репозиториев в которым требуется доступ, Git запросит пароль или парольную фразу для ключа шифрования, в зависимости от того, как он настроен.

После загрузки подмодуля, его указатель HEAD будет отделен (detached). Если не переключиться в какую-либо ветку подмодуля (например, main), можно потерять изменения. Переключитесь в ветку main:

git checkout main

Теперь можно продолжать работу как обычно.