Перейти к главному содержимому

git submodules

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

Добавить субмодуль можно командой:

git submodule add [-b branch] [--name name] url path

Например:

git submodule add -b master ../../bf531/libaaa shared/libaaa

Лучше чтобы URL был относительным (само собой если репозиторий находится на том же сервере). Иначе могут быть проблемы при клонировании разными способами (по ssh, https и т. п.).

Изменить url субмодуля

Новый способ

git submodule set-url -- <path> <url>

Пример:

git submodule set-url -- shared/libglobal ../../libs/libglobal

Старый способ

Отредактировать файл .gitmodules.

Можно редактировать как обычный файл, а можно командами с консоли:

git config --file=.gitmodules submodule.libaaa.url ../../bf531/libaaa
git config --file=.gitmodules submodule.libaaa.branch dev-branch

После этого вызвать:

git submodule sync
git submodule update --init --recursive

Удалить субмодуль

  • Удалить секцию из .gitmodules.
  • Удалить секцию из .git/config.
  • Запустить git rm --cached path_to_submodule (без слеша на конце).
  • Закоммитить изменения git add .gitmodules; git commit -m "remove submodule"
  • Удалить каталог с файлами субмодуля rm -rf path_to_submodule.
sname=libaaa
spath=shared/libaaa

git config -f .gitmodules --remove-section submodule.${sname%/}
git config -f .git/config --remove-section submodule.${sname%/}
git rm --cached ${sname%/}

git add .gitmodules
git commit
rm -rf ${spath%/}

Инициализация субмодулей по существующему файлу .gitmodules

#!/bin/sh

set -e

git config -f .gitmodules --get-regexp '^submodule\..*\.path$' |
    while read path_key path
    do
        url_key=$(echo $path_key | sed 's/\.path/.url/')
        url=$(git config -f .gitmodules --get "$url_key")
        git submodule add $url $path
    done