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.