rastreamento do submódulo git mais recente

136

Estamos movendo nosso (enorme) projeto para o git e estamos pensando em usar submódulos. Nosso plano é ter três cabeças diferentes no superprojeto: release, stable, latest. Os líderes do projeto cuidarão da liberação e dos ramos estáveis. Eles moverão os submódulos conforme necessário.

A questão é a cabeça "mais recente". Gostaríamos que o superprojeto "mais recente" acompanhasse as ramificações principais de todos os submódulos (automaticamente). E também seria ótimo se mostrasse a história de todos os commit no submódulo.

Eu olhei para o gitslave, mas não é bem o que queremos. Alguma sugestão?

l.thee.a
fonte
Enquanto você solicitou uma ferramenta, eu só quero conectar esta pergunta, que coleta one-liners fazendo a mesma coisa: stackoverflow.com/questions/1030169/…
Tobu
Agora, o Git oferece o rastreamento das mais recentes com submódulos: veja minha resposta editada.
VonC

Respostas:

235

Atualização de março de 2013

O Git 1.8.2 adicionou a possibilidade de rastrear ramificações.

" git submodule" começou a aprender um novo modo de integração com a ponta da ramificação remota (em oposição à integração com a confirmação registrada no gitlink do superprojeto).

# add submodule to track master branch
git submodule add -b master [URL to Git repo];

# update your submodule
git submodule update --remote 

Se você já tinha um submódulo presente, agora deseja rastrear uma ramificação, consulte " como fazer com que um submódulo existente rastreie uma ramificação ".

Consulte também o tutorial de Vogella sobre submódulos para obter informações gerais sobre submódulos.

Nota:

git submodule add -b . [URL to Git repo];
                    ^^^

Veja a git submodulepágina de manual :

Um valor especial de .é usado para indicar que o nome da ramificação no submódulo deve ser o mesmo nome que a ramificação atual no repositório atual .


Consulte commit b928922727d6691a3bdc28160f93f25712c565f6 :

submodule add: Se --branchfor fornecido, registre-o em.gitmodules

Isso permite que você grave facilmente uma submodule.<name>.branchopção .gitmodulesao adicionar um novo submódulo. Com esse patch,

$ git submodule add -b <branch> <repository> [<path>]
$ git config -f .gitmodules submodule.<path>.branch <branch>

reduz a

$ git submodule add -b <branch> <repository> [<path>]

Isso significa que chamadas futuras para

$ git submodule update --remote ...

receberá atualizações do mesmo ramo que você usou para inicializar o submódulo, que geralmente é o que você deseja.

Assinado por: W. Trevor King


Resposta original (fevereiro de 2012):

Um submódulo é um único commit referenciado por um repositório pai.
Como é um repositório Git por si só, a "história de todos os commits" é acessível através de um git logdentro desse submódulo.

Portanto, para um pai rastrear automaticamente a confirmação mais recente de uma ramificação de um sub-módulo, seria necessário:

  • cd no submódulo
  • git fetch / pull para garantir que ele tenha as confirmações mais recentes no ramo direito
  • CD de volta no repositório principal
  • adicione e confirme para registrar o novo commit do submódulo.

O gitslave (que você já viu) parece ser o melhor ajuste, inclusive para a operação de confirmação .

É um pouco chato fazer alterações no submódulo devido ao requisito de fazer check-out no ramo correto do submódulo, fazer a alteração, confirmar e, em seguida, entrar no superprojeto e confirmar o commit (ou pelo menos registrar o novo local do submódulo).

Outras alternativas são detalhadas aqui .

VonC
fonte
1
@BraveNewMath você precisa fazer o checkout do ramo direito em seu sub-módulo, em seguida, ir para a sua repo pai e digite: git config -f .gitmodules submodule.<path>.branch <branch>. Adicione tudo, confirme e empurre.
VonC 13/09/13
2
@BraveNewMath Eu detalho todas as etapas para fazer um submódulo rastrear uma ramificação em stackoverflow.com/a/18799234/6309 .
VonC 14/09/13
1
É importante usar a --remotetag se você não deseja obter cabeças desanexadas ao atualizar, se perguntando por que parece que seu código recém-extraído está por trás do master!
28515 Chris Watts
3
@DC_ Concordo com "esta resposta" (desde que a escrevi). O recurso "seguindo uma ramificação" visa atualizar um submódulo para a confirmação mais recente de uma ramificação. Feito isso, você ainda precisará adicionar e confirmar o novo estado do submódulo no repositório pai. E o próximo clone fará o checkout desse estado (sem cabeça).
VonC 26/07/19
3
@VonC Para esclarecer melhor, o recurso "seguir uma ramificação" afeta apenas o comportamento do git submodule updatecomando, informando a qual commit (ou seja, o commit mais recente no master) para atualizar o submódulo, não fazendo com que o repositório pai atualize automaticamente quais commit é apontado pelo submódulo no momento do clone?
26917 christner