Есть ли способ автоматически иметь git submodule update
(или предпочтительно git submodule update --init
для вызова при выполнении git pull
?
Ищете параметр конфигурации git или псевдоним git, чтобы помочь с этим.
Есть ли способ автоматически иметь git submodule update
(или предпочтительно git submodule update --init
для вызова при выполнении git pull
?
Ищете параметр конфигурации git или псевдоним git, чтобы помочь с этим.
Начиная с 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 "[email protected]" && git submodule update --init --recursive; }; f'
Начиная с 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 config
справочная страница (1.7.5) (или последняя git config
справочная страница)git fetch
справочная страница (1.7.5) (или последняя git fetch справочная страница)для получения дополнительной информации.
git fetch --recurse-submodules[=yes|on-demand|no]
Я удивлен, что никто не упомянул об использовании git крючков для этого!
Просто добавьте файлы с именами post-checkout
и post-merge
в каталог .git/hooks
соответствующих репозиториев и поместите в них каждый из них:
#!/bin/sh
git submodule update --init --recursive
Поскольку вы specfically попросили псевдоним, предполагая, что вы хотите иметь это для многих репозиториев, вы можете создать псевдоним, который добавляет их в репозиторий .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 [[ [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
}
Как уже упоминали другие, вы можете легко установить это с помощью:
git config --global submodule.recurse true
Однако, если вы похожи на меня и у вас более сложная настройка .gitconfig
(мой основной файл ~/.gitconfig
использует include
для загрузки в другие файлы .gitconfig
), и вы никогда не сможете вспомнить, как преобразовывать git
config из командной строки. формат и формат .gitconfig
, как добавить его в любой из ваших файлов .gitconfig
:
[submodule]
recurse = true