Есть ли способ заставить git pull автоматически обновлять подмодули?

есть ли способ автоматически иметь git submodule update (или, предпочтительно git submodule update --init когда git pull делается?

ищет параметр конфигурации git или псевдоним git, чтобы помочь в этом.

7 ответов


начиная с git 2.14, вы можете установить submodule.recurse в true, чтобы включить желаемое поведение.

Вы можете сделать это глобально с помощью команды:

git config --global submodule.recurse true

git config --global alias.pullall '!git pull && git submodule update --init --recursive'

Если вы хотите, чтобы аргументы передавались в git pull, используйте это вместо этого:

git config --global alias.pullall '!f(){ git pull "$@" && git submodule update --init --recursive; }; f'

начиная с git 1.7.5, он должен автоматически обновлять подмодули по умолчанию, как вы хотите.

[EDIT: в комментариях: новое поведение 1.7.5-автоматически fetch последние коммиты для подмодулей, но не to обновление них (в git submodule update sense). Таким образом, информация в этом ответе актуальна в качестве фона, но сама по себе не является полным ответом. Вам все еще нужен псевдоним, чтобы вытащить и обновить подмодули в одном команда.]

поведение по умолчанию "по требованию" - обновлять подмодули всякий раз, когда вы получаете фиксацию, которая обновляет фиксацию подмодуля, и эта фиксация еще не находится в вашем локальном клоне.
Вы также можете обновить его на каждой выборке или никогда (я предполагаю, что поведение до 1.7.5).
Параметр config для изменения этого поведения -fetch.recurseSubmodules.

этот параметр может быть установлен в логическое значение или в on-demand.
Установка его в логическое значение изменяет поведение fetch и pull безоговорочно рекурсировать в подмодули, когда установлено значение true или не рекурсировать вообще, когда установлено значение false.

при установке on-demand (значение по умолчанию), fetch и pull будет выполняться только в населенных субмодуль, когда его суперпроекты получает подтверждение, что обновления ссылка подмодуль л!--18-->.

посмотреть:

для получения дополнительной информации.

git fetch --recurse-submodules[=yes|on-demand|no]

Я удивлен, что никто не упоминал об использовании крючков git для этого!

просто добавьте файлы с именем post-checkout и post-merge на .git/hooks каталог соответствующих репозиториев и поместите в каждый из них следующее:

#!/bin/sh
git submodule update --init --recursive

поскольку вы специально попросили псевдоним, предполагая, что вы хотите иметь это для многих репозиториев,вы можете создать псевдоним, который добавляет их в.git/hooks для вас.


псевдоним, как предложил Кевин Баллард, является совершенно хорошим решением. Просто чтобы бросить еще один вариант, вы также можете использовать крюк после слияния, который просто работает git submodule update [--init].


можно создать псевдоним для команды git, которая автоматически обрабатывает обновление подмодуля. Добавьте следующее к вашему .bashrc и

# make git submodules usable
#   This overwrites the 'git' command with modifications where necessary, and
#   calls the original otherwise
git() {
    if [[ $@ == clone* ]]; then
        gitargs=$(echo "$@" | cut -c6-)
        command git clone --recursive $gitargs
    elif [[ $@ == pull* ]]; then
        command git "$@" && git submodule update --init --recursive
    elif [[ $@ == checkout* ]]; then
        command git "$@" && git submodule update --init --recursive
    else
        command git "$@"
    fi
}

как уже упоминалось, вы можете легко установить это с:

git config --global submodule.recurse true

однако, если вы похожи на меня и имеете более сложный .gitconfig настройка (моя главная ~/.gitconfig использует файл include загрузить в другой .gitconfig файлы), и вы никогда не сможете вспомнить, как конвертировать между командной строкой config и .gitconfig формат, вот как добавить его в любой из ваших .gitconfig файлы:

[submodule]
  recurse = true