Есть ли способ заставить git pull автоматически обновлять подмодули? - PullRequest
159 голосов
/ 06 января 2011

Есть ли способ автоматически вызывать git submodule update (или предпочтительно git submodule update --init при каждом вызове git pull?

Требуется настройка git config или псевдоним git, чтобы помочь с этим.

Ответы [ 7 ]

111 голосов
/ 06 января 2011

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'
101 голосов
/ 22 марта 2018

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

Вы можете сделать это глобально, запустив:

git config --global submodule.recurse true
42 голосов
/ 27 апреля 2011

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

[РЕДАКТИРОВАТЬ: по комментариям: новое поведение 1.7.5 - автоматически извлекать последние коммиты для подмодулей, но не до обновлять их (в git submodule update смысл). Таким образом, информация в этом ответе актуальна как справочная информация, но сама по себе она не является полным ответом. Вам все еще нужен псевдоним для извлечения и обновления подмодулей в одной команде.]

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

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

Если установлено значение on-demand (значение по умолчанию), fetch и pull будут возвращаться в заполненный субмодуль только тогда, когда его суперпроект получает фиксацию, которая обновляет ссылку подмодуля .

См:

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

git fetch --recurse-submodules[=yes|on-demand|no]
28 голосов
/ 23 мая 2016

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

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

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

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

8 голосов
/ 06 января 2011

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

5 голосов
/ 22 августа 2015

Вы можете создать псевдоним для команды 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
}
4 голосов
/ 06 сентября 2018

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

git config --global submodule.recurse true

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

[submodule]
  recurse = true
...