Есть ли способ автоматически вызывать git submodule update
(или предпочтительно git submodule update --init
вызывать, когда git pull
это делается?)
Ищите настройки git config или псевдоним git, чтобы помочь с этим.
Есть ли способ автоматически вызывать git submodule update
(или предпочтительно git submodule update --init
вызывать, когда git pull
это делается?)
Ищите настройки git config или псевдоним git, чтобы помочь с этим.
Ответы:
Начиная с Git 2.14 , вы можете использовать git pull --recurse-submodules
(и псевдоним это все, что вам нравится).
Начиная с Git 2.15 , вы можете установитьsubmodule.recurse
значение true, чтобы включить желаемое поведение.
Вы можете сделать это глобально, запустив:
git config --global submodule.recurse true
git pull
к получению субмодуля и запуску submodule update
. Это действительно должен быть принятый ответ сейчас
git config --global submodule.recurse true
git clone
также. И сделать это по умолчанию. Иначе всегда будет огромное сопротивление использованию подмодулей, так как модули людей всегда не синхронизированы :-(
commit
, fetch
, pull
и т.д.) предназначены для применения только к текущему хранилище. подмодуль является другим хранилищем и на него не должны влиять команды, выполняемые в родительском хранилище по умолчанию. это своего рода дизайнерское решение git-разработчика.
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 поведение автоматически получать последние коммиты для подмодулей, но не для обновления их (вgit submodule update
смысле). Таким образом, информация в этом ответе актуальна как справочная информация, но сама по себе она не является полным ответом. Вам все еще нужен псевдоним для извлечения и обновления подмодулей в одной команде.]
Поведение по умолчанию «по требованию» - обновлять субмодули всякий раз, когда вы выбираете коммит, который обновляет коммит субмодуля, а этот коммит еще не находится в вашем локальном клоне.
Вы также можете обновлять его при каждой загрузке или никогда (поведение до 1.7.5, я полагаю).
Параметр конфигурации, чтобы изменить это поведение fetch.recurseSubmodules
.
Эта опция может быть установлена либо в логическое значение, либо в
on-demand
.
Установка его в логическое значение изменяет поведениеfetch
иpull
безоговорочно переходить в подмодули, если задано значение true или вообще не рекурсивно, если задано значение false.Если установлен в
on-demand
(значение по умолчанию),fetch
иpull
только рекурсии в населенный подмодуль , когда его суперпроект извлекает коммит , что обновления эталонного подмодуля в .
Видеть:
git config
Страница man (1.7.5) (или последняя git config
страница man )git fetch
Страница man (1.7.5) (или последняя страница man git fetch )Чтобы получить больше информации.
git fetch --recurse-submodules[=yes|on-demand|no]
git fetch
не git submodule update
.
git pull
, а не с git fetch
, эта опция только делает выборку рекурсивной. Это вообще не изменит то, что зафиксировано в подмодулях. Так git submodule update
что все еще необходимо, как отмечает @Artem.
Я удивлен, что никто не упомянул использование git hooks для этого!
Просто добавьте файлы с именами post-checkout
и post-merge
в свой .git/hooks
каталог соответствующих репозиториев, и поместите в каждый из них следующее:
#!/bin/sh
git submodule update --init --recursive
Поскольку вы специально запросили псевдоним, предполагая, что вы хотите иметь его для многих репозиториев, вы можете создать псевдоним, который добавляет их в репозиторий .git/hooks
для вас.
core.hooksPath
для каталога hooks , подробности см. В документации git-config
.
git pull --rebase
:(
Вы можете создать псевдоним для команды 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
файлы), и вы никогда не сможете вспомнить, как выполнить преобразование между git
форматом конфигурации командной строки и .gitconfig
форматом, вот как его добавить. к любому из ваших .gitconfig
файлов:
[submodule]
recurse = true
Единственный способ, которым я смог получить подмодули и вложенные подмодули для обновления:
git submodule update --remote --merge --recursive; git submodule foreach --recursive "(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);" git add .; git commit -m 'SubmodulesSynced'; git push; git pull;
Я изо всех сил пытался создать псевдоним через терминал из-за скобок, поэтому мне пришлось вручную добавить это в .gitconfig для глобального:
[alias] supdate = "!git submodule update --remote --merge --recursive; git submodule foreach --recursive '(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);' git add .; git commit -m 'SubmodulesSynced'; git push; git pull;"
Любые предложения о том, как запускать команды или псевдоним автоматически?