Git: работа с подмодулями
Как можно прочитать, один репозиторий можно сделать подмодулем другого, например в целях использования в качестве библиотеки.
Сначала нужно добавить подмодуль в текущий репозиторий:
После этого добавленный репозиторий (подмодуль) будет размещен в директории со своим именем, а также будет создан файл .gitmodules в котором будут сохранены сведения о подмодуле и других подмодулях, если вы их также добавите.
Если после добавления подмодуля сразу выполнить git status, то вы увидите, что в индекс уже были добавлены указанный файл и директория подмодуля. Теперь можно сделать коммит и эти изменения попадут в текущий репозиторий.
Примечание: если вы добавите в качестве подмодуля пустой репозиторий, он не будет добавлен в индекс, т.к. просто нечего добавлять.
Если после добавления подмодуля внести изменения в его файлы, Git в текущем репозитории будет указывать на изменения, но добавлять их в индекс не будет. Чтобы фиксировать изменения в подмодуле, нужно переходить в его директорию и работать там как с обычным репозиторием, только как бы вложенным.
После того как вы зашли в директорию подмодуля, добавили изменения в индекс, затем выполнили там же коммит, вы можете сделать push и изменения в подмодуле будут загружены на сервер.
Далее, вы можете выйти из директории подмодуля в директорию основного проекта, добавить в индекс директорию, выполнить коммит и также отправить изменения на сервер.
Обратите внимание, что если вы изменили что-то в файлах подмодуля, но не выполнили коммит, то в основном проекте вы также не сможете сделать коммит. Если же вы выполнили коммит в подмодуле, но не отправили изменения на сервер, то выполнив
pushв основном проекте, вы отправите на сервер ссылку на последний коммит в подмодуле (а он еще не отправлен на сервер).
Проще говоря, самый простой и понятный способ работы с подмодулями - это выполнять работы с учетом необходимости синхронизации изменений: сначала меняете что-то в подмодулях, затем меняете что-то в основном репозитории.
Есть особенность при клонировании репозитория, содержащего подмодули. После клонирования директории подмодулей будут пусты. Чтобы получить подмодули, нужно выполнить:
либо более короткий вариант - добавьте опцию --recurse-submodules при клонировании.
Если подмодули загружаются из репозиториев в которым требуется доступ, Git запросит пароль или парольную фразу для ключа шифрования, в зависимости от того, как он настроен.
После загрузки подмодуля, его указатель HEAD будет отделен (detached). Если не переключиться в какую-либо ветку подмодуля (например, main), можно потерять изменения. Переключитесь в ветку main:
Теперь можно продолжать работу как обычно.