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

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

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

Ответ 1

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

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

git config --global submodule.recurse true

Ответ 2

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

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

git config --global alias.pullall '!f(){ git pull "[email protected]" && git submodule update --init --recursive; }; f'

Ответ 3

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

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

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

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

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

См:

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

git config --global submodule.recurse true

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

[submodule]
  recurse = true