![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Заметка для себя, чтоб не потерять.
Типичная задача: добавить сабмодуль в git-репозиторий.
Решение человека, только что читавшего мануал: $ git submodule add git@host:path/repo.git. Клонирует удалённый репозиторий в подкаталог текущего, регистрирует его в .gitmodules и .git/config.
Как обычно получается у меня: $ git clone git@host:path/repo.git. Клонирует удалённый репозиторий в подкаталог текущего и больше ничего не делает. Обнаруживается это где-то ближе к тому моменту, когда добавление сабмодуля нужно закоммитить.
Соответственно, задача: На входе есть суперпроект (в терминах git-submodule(1)) и внутри него локальная копия репозитория, который нужно сделать сабмодулем. Считаем, что текущий каталог находится внутри суперпроекта, а корень будущего сабмодуля является непосредственным подкаталогом текущего. Решение методом выливания воды из чайника заранее отметаем как неизящное.
Из инструментов у нас есть git submodule add [-b <branch>] <repository> <path>
. Ветку указывать нужно в редких случаях и можно руками. Путь легко вводится по M-RET в Midnight Commander’е. А вот URL репозитория хочется достать и подставить автоматически.
Достать путь можно так: $ git -C <submodule> config --get remote.origin.url.
Однако писать $ git submodule add $(<строчка выше>) каждый раз утомительно, поэтому добавляем алиас:
$ git config --global --edit
[alias]
subinit = !sh -c 'sub="$1" && shift && git submodule add "$@" $(git -C "$sub" config --get remote.origin.url)' -
$ git subinit repo
Adding existing repo at 'repo' to the index
$ git subinit repo2 -b master
Adding existing repo at 'repo' to the index