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.


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.


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

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'

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'

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.