Есть ли способ заставить 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 config
man страница (1.7.5) (илиgit config
man page) -
git fetch
man page (1.7.5) (или git fetch man page)
для получения дополнительной информации.
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