git submodules

Подмодули git.

Содержание

1 Общая информация

1.1 Прагматика

  • Нужно включить сторонний код в проект.
  • Простейший путь: скопировать код из git в свой проект.
  • Недостатки этого подхода:
    • смешивание нескольких проектов в один;
    • после обновления стороннего проекта придётся вручную обновлять код.
  • Общее правило в разработке программного обеспечения: держать отдельные вещи отдельно.
  • Преимущества подмодулей git:
    • обеспечивается согласованный интерфейс для подключения стороннего кода.
  • Подмодули в git являются просто репозиториями git.
  • Подмодуль помещается в родительский репозиторий git.

2 Операции с подмодулями

2.1 Добавление подмодуля

  • Для добавления нового подмодуля используется команду git submodule add:
    1git submodule add https://github.com/chaconinc/DbConnector
    
  • Создаётся файл .gitmodules. Это конфигурационный файл, в котором хранится соответствие между URL проекта и локальным подкаталогом:
    1[submodule "DbConnector"]
    2        path = DbConnector
    3        url = https://github.com/chaconinc/DbConnector
    

2.2 Клонирование проекта с подмодулями

  • Можно сначала склонировать проект, а потом склонировать подмодули.
  • Нужно выполнить команды:
    • git submodule init: для инициализации локального конфигурационного файла;
    • git submodule update: для получения всех данных этого проекта и извлечения соответствующего коммита, указанного в основном проекте.
  • Эти команды можно заменить одной: git submodule update --init или git submodule update --init --recursive.
  • Можно склонировать сразу с подмодулями, использую опцию --recurse-submodules:
    1git clone --recurse-submodules https://github.com/chaconinc/MainProject
    

2.3 Рекурсивное обновление подмодулей

  • Обычно достаточно задать опцию --recurse-submodules при обновлении:
    1git pull --recurse-submodules
    
  • В более сложных случаях для обновления подмодулей можно использовать следующие команды:
    1git submodule init
    2git submodule update
    3git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'
    
  • При этом подмодули автоматически сразу устанавливается в HEAD.

Дмитрий Сергеевич Кулябов
Дмитрий Сергеевич Кулябов
Профессор кафедры теории вероятностей и кибербезопасности

Мои научные интересы включают физику, администрирование Unix и сетей.

Похожие