Есть ли способ автоматически вызывать 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;"
Любые предложения о том, как запускать команды или псевдоним автоматически?