Случается так, что во время работы над некоторым проектом появляется необходимость использовать внутри него ещё какой-то проект либо библиотеку. Встроить нужное расширение в один проект не составляет особых проблем. Но когда у вас множество проектов, использующих одни и те же библиотеки, либо вложенные проекты, которые хочется рассматривать по отдельности, то вы рискуете запутаться и потратить много времени на их обьединение вручную.

В таких ситуациях на помощь приходят подмодули в GIT. Они позволяют включать в репозиторий другие репозитории как подпапки. Такие репозитории имеют автономную историю изменений и могут обновляться независимо от основного репозитория.

Для добавления подмодуля необходимо выполнить команду

git submodule add <repo> <folder>

где <repo> — путь к репозиторию проекта, а <folder> — путь к каталогу, где необходимо разместить подмодуль в текущем проекте.

К примеру, вы разрабатываете несколько проектов на PHP, и во всех хотите использовать шаблонизатор Twig. Чтобы не дублировать его в каждом проекте, мы подключим его командой:

git submodule add https://github.com/twigphp/Twig.git ./library/twig

Теперь использовать Twig можно, обращаясь в директорию library/twig относительно корня вашего проекта.

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

git submodule init

А после инициализации загрузить все подмодули проекта в свои директории командой:

git submodule update

В случае, если вы не знаете весь список подмодулей проекта, используйте команду:

git submodule

Также полный их список можно найти в файле .gitmodules в корне проекта.

Делая pull вашего проекта, вы не всегда получаете последнюю версию подмодулей. Чтобы быть уверенным, что используются последние их версии, выполните команду:

git submodule update --init --recursive

Самой утомительной операцией является удаление подмодуля:

  1. Для начала необходимо удалить нужную секцию в файле .gitmodules. Занимает она 3 строки и выглядит так:
    [submodule "vendor"]
    path = vendor 
    url = git://github.com/some-user/some-repo.git
  2. Зафиксировать изменения, выполнив:
    git add .gitmodules
  3. Удалить релевантную строку из .git/config, которая выглядит так:
    [submodule "vendor"] 
    url = git://github.com/some-user/some-repo.git
  4. Выполнить:
    git rm --cached path/to/submodule

    где path/to/submodule — путь к директории подмодуля.

  5. Выполнить:
    rm -rf .git/modules/submodule_name

    где submodule_name — название подмодуля.

  6. Сделать коммит изменений.
  7. Удалить более ненужные файлы подмодулей:
    rm -rf path/to/submodule

    где path/to/submodule — путь к директории подмодуля.

Вот и все. Теперь вы настроили подмодули и избавились от рутинной работы по их организации вручную. Можно потратить это время на более продуктивную работу.