Existe uma maneira de ter automaticamente git submodule update
(ou de preferência git submodule update --init
chamado sempre que git pull
for feito?
Procurando uma configuração de configuração do git ou um alias do git para ajudar com isso.
Existe uma maneira de ter automaticamente git submodule update
(ou de preferência git submodule update --init
chamado sempre que git pull
for feito?
Procurando uma configuração de configuração do git ou um alias do git para ajudar com isso.
Respostas:
No Git 2.14 , você pode usar git pull --recurse-submodules
(e aliasar para o que quiser).
No Git 2.15 , você pode definir submodule.recurse
como true para ativar o comportamento desejado.
Você pode fazer isso globalmente executando:
git config --global submodule.recurse true
git pull
que também busque um submódulo e execute submodule update
. Este realmente precisa ser a resposta aceita agora
git config --global submodule.recurse true
git clone
também. E ativá-lo por padrão. Caso contrário, sempre haverá uma enorme resistência ao uso de submódulos, pois os módulos das pessoas sempre ficam fora de sincronia :-(
commit
, fetch
, pull
, etc.) são concebidos para ser aplicado apenas para o repositório corrente. um submódulo é outro repositório e não deve ser afetado por comandos executados no repositório pai por padrão. esse é um tipo de decisão de design do desenvolvedor do git.
git config --global alias.pullall '!git pull && git submodule update --init --recursive'
Se você deseja que os argumentos sejam passados para o git pull, use-o:
git config --global alias.pullall '!f(){ git pull "$@" && git submodule update --init --recursive; }; f'
A partir do Git 1.7.5, ele deve atualizar os submódulos automaticamente por padrão, como você deseja.
[EDIT: por comentários: o novo 1.7.5 comportamento é automaticamente buscar as últimas commits para submódulos, mas não para atualizar -los (no git submodule update
sentido). Portanto, as informações nesta resposta são relevantes como pano de fundo, mas não são uma resposta completa por si só. Você ainda precisa de um alias para extrair e atualizar submódulos em um comando.]
O comportamento padrão, "sob demanda", é atualizar submódulos sempre que você buscar uma confirmação que atualize a submissão do submódulo, e essa confirmação ainda não está localizada no seu clone local.
Você também pode atualizá-lo a cada busca ou nunca (comportamento anterior à 1.7.5, presumo).
A opção de configuração para alterar esse comportamento é fetch.recurseSubmodules
.
Esta opção pode ser definida como um valor booleano ou como
on-demand
.
Configurá-lo como booleano altera o comportamento defetch
epull
recursivamente incondicionalmente em submódulos quando definido como true ou de não recursar quando definido como false.Quando definido como
on-demand
(o valor padrão),fetch
epull
retornará apenas para um sub-módulo preenchido quando seu superprojeto recuperar uma confirmação que atualiza a referência do sub-módulo .
Vejo:
git config
página de manual (1.7.5) (ou git config
página de manual mais recente )git fetch
página man (1.7.5) (ou página man mais recente do git fetch )Para maiores informações.
git fetch --recurse-submodules[=yes|on-demand|no]
git fetch
, não a git submodule update
.
git pull
, em vez de git fetch
, esta opção apenas torna a busca recursiva. Ele não mudará qual commit é verificado nos submódulos. Portanto, git submodule update
ainda é necessário, conforme observado pelo @Artem.
Estou surpreso que ninguém tenha mencionado o uso de ganchos git para fazer isso!
Basta adicionar arquivos nomeados post-checkout
e post-merge
ao seu .git/hooks
diretório de repositórios relevantes e colocar o seguinte em cada um deles:
#!/bin/sh
git submodule update --init --recursive
Como você solicitou um alias especificamente, assumindo que deseja ter isso para muitos repositórios, é possível criar um alias que os adicione aos repositórios .git/hooks
para você.
core.hooksPath
para um diretório hooks , consulte a documentação para git-config
obter mais detalhes.
git pull --rebase
:(
Você pode criar um alias para o comando git que lida automaticamente com a atualização do sub-módulo. Adicione o seguinte ao seu .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
}
Como outros já mencionaram, você pode facilmente definir isso com:
git config --global submodule.recurse true
No entanto, se você gosta de mim e tem uma .gitconfig
configuração mais complexa (meu ~/.gitconfig
arquivo principal usa include
para carregar em outros .gitconfig
arquivos), e você nunca se lembra de como converter entre o git
formato de configuração da linha de comando e o .gitconfig
formato, veja como adicioná-lo para qualquer um dos seus .gitconfig
arquivos:
[submodule]
recurse = true
A única maneira de conseguir atualizar os submódulos e submódulos aninhados:
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;
Eu estava lutando para criar o alias através do terminal devido aos colchetes, então tive que adicioná-lo manualmente ao .gitconfig para global:
[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;"
Alguma sugestão de como executar os comandos ou o alias automaticamente?