Sub-módulos de atualização do Git recursivamente

282

Minha estrutura de projeto

ProjectA
-FrameworkA (submodule)
--Twig (submodule of FrameworkA)

Como posso atualizar submódulos recursivamente? Eu já tentei alguns comandos git (na raiz do ProjectA)

git submodule foreach git pull origin master

ou

git submodule foreach --recursive git pull origin master

mas não pode extrair arquivos do Twig.

complez
fonte
Que tal git-deep ?
Mathew Kurian

Respostas:

607
git submodule update --recursive

Você provavelmente também desejará usar a opção --init, que fará com que seja inicializado qualquer sub-módulo não inicializado:

git submodule update --init --recursive

Nota: em algumas versões mais antigas do Git , se você usar a --initopção, os submódulos já inicializados podem não ser atualizados. Nesse caso, você também deve executar o comando sem --initopção.

drewag
fonte
1
Que tal submódulo adicionar recursivo? "O submodulo git adiciona FrameworkA.git" apenas puxa arquivos do FrameworkA.
complez
2
Você pode simplesmente fazer um "sub-módulo git add blah" e depois "atualização do sub-módulo git --init --recursive".
drewag
Isso é diferente do meu caminho abaixo?
William Entriken 26/09
3
@Irineau A observação de que os submódulos já inicializados não estão sendo atualizados se --initusados ​​não corresponde às minhas experiências no Git 2.2.2. Vejo os submódulos de nível superior e aninhados que já foram inicializados recebendo a confirmação correta quando uso git submodule update --init --recursive, e acho que a reivindicação de que você precisa executar o comando com e sem --initestá simplesmente errada. A menos que alguém possa mostrar evidências de que esse é o comportamento ou demonstrar que ele mudou entre as versões e já foi verdade, planejo editá-lo completamente.
Mark Amery
3
@ MarkAmery, lembro que isso é um problema em alguma versão do git que não consigo lembrar. Acabei de o testar no 1.9.3 e o problema parece não existir mais. Eu atualizei a resposta para se referir a uma vaga "versões antigas". Se alguém puder especificar qual versão mudou esse comportamento, isso seria ótimo.
drewag
35

O jeito que eu uso é:

git submodule update --init --recursive
git submodule foreach --recursive git fetch
git submodule foreach git merge origin master
William Entriken
fonte
6
Eu trabalhei com a alteração da última linha para:git submodule foreach git pull --ff-only origin master
Gilad Peleg 23/10
2
Eu também adicionaria --recursive à última linha: "submódulo git para cada mestre de origem de mesclagem --recursive git", caso contrário você pode obter um submódulo sujo quando ele próprio atualizou um submódulo.
Michael Scott Cuthbert
Estive procurando por isso nas últimas três horas. Obrigado senhor. Para acrescentar a isto, você também pode usar esses comandos para cometer, tais como: git submodule foreach --recursive 'git commit -a | :'. O :faz loop independentemente do resultado. Consulte o link stackoverflow.com/questions/19728933/… .
Iniciante Pidgeon
17

Como pode acontecer que a ramificação padrão dos seus sub-módulos não seja master (o que acontece muito no meu caso), é assim que automatizo as atualizações completas dos sub-módulos do Git:

git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'
Sebastien Varrette
fonte
Eu tentei adicionar este comando no meu Makefile genérico, mas ainda estou preso para fazer o GNU Make ignorar a interpretação da sequência $ (...), apesar de estar presente entre aspas simples. Alguém tem uma ideia?
Sebastien Varrette 19/03/2014
Seu comando é o que eu precisava, obrigado! Mas eu recebo: Entering 'Core' fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working tree.onde Core é o submodule
Sanandrea
Além disso, eu acho que você precisa descobrir este comentário stackoverflow.com/a/18008139/3383543
Ahmad AlMughrabi
não ter a opção recursiva significa que isso só funcionará se seus submódulos não incluírem submódulos novamente.
Erikbwork
15

No Git recente (estou usando a v2.15.1), o seguinte mesclará as alterações do sub-módulo upstream nos sub-módulos recursivamente:

git submodule update --recursive --remote --merge

Você pode adicionar --initpara inicializar qualquer sub-módulo não inicializado e usá- --rebaselo se desejar rebase em vez de mesclar.

Você precisa confirmar as alterações posteriormente:

git add . && git commit -m 'Update submodules to latest revisions'
Mrts
fonte
Pensei que estivesse fazendo algo errado, mas sua resposta me confirmou que também git submodule update --remote my-dir/my-submodulefunciona
iomv 18/02