Eu tenho um repositório git que usa um sub-módulo que eu gostaria de apontar para uma tag anotada, mas quando eu faço git submodule update
novas tags não são obtidas. Eu posso obter novas tags no submódulo digitando o submódulo e fazendo um git fetch --tags
lá, mas eu realmente gostaria de fazer tudo isso do lado de fora como está escrito.
Eu não consigo encontrar nada na documentação do git sugerindo uma maneira de obter git submodule update
para incluir tags (minha versão git é 1.7.3.5).
Obviamente, há outra possibilidade - apontar o submódulo no commit para o qual a tag aponta, e não a tag em si, mas isso não parece tão legal.
Existe uma maneira de obter git submodule update
incluir tags?
Respostas:
7 para resposta № 1git submodule
é implementado como um shell script, então é fácil ver o que ele está fazendo - pode ser /usr/lib/git-core/git-submodule
se você está usando uma versão empacotada. Essencialmente, apenas roda git-fetch
no submódulo se o nome do objeto (SHA1sum) armazenado na árvore do projeto principal não corresponder à versão retirada no submódulo, como Koraktor aponta.
o documentação para git fetch
(ou man git-fetch
enquanto kernel.org is down) diz que deve buscar cada tag que aponta para um objeto baixado, e os objetos baixados incluirão todo commit que é um ancestral de cada branch que foi buscado. Isso significa que é surpreendente para mim que você não tenha todas as tags relevantes em um git submodule update
.
Se é o caso que o que você realmente quer é que seu script seja tentar definir uma nova versão do submódulo e confirmar esse resultado, eu não acho que git submodule update
é a ferramenta que você quer - que é só paracertificando-se de que seus submódulos estão na versão correta com base no que está atualmente no commit do projeto principal. Em vez disso, você deve apenas fazer algo como:
( cd my-submodule &&
git fetch &&
git fetch --tags &&
git checkout my-tag )
git add my-submodule
git commit -m "Update the submodule to the "my-tag" version" my-submodule
(Eu adicionei um extra git fetch --tags
apenas no caso de sua tag não é aquela que aponta para um commit baixado.
Obviamente, há outra possibilidade - apontar o submódulo no commit para o qual a tag aponta, e não a tag em si, mas isso não parece tão legal.
Bem, a única coisa que é armazenada na árvore do projeto principal para o submódulo é apenas o hash do objeto commit, portanto, mesmo que houvesse um comando que dizia "configure meu submódulo para a tag my-tag
nesse submódulo ", acabaria armazenando o hash correspondente a essa tag ...
13 para resposta № 2
Resposta tardia aqui, mas estou surpreso que ninguém mencionou git submodule foreach
. Esta é basicamente a maneira como resolvi o problema exato que você encontrou:
git submodule foreach --recursive "git fetch --tags"
git submodule update --recursive
--recursive
flag está lá para recorrer a submódulos filho.
3 para resposta № 3
git submodule update
Não obtém nada se os seus submódulos estiverem atualizados. Portanto, isso pode ser um equívoco.
git submodule update
trará o conteúdo do diretório de trabalho dos submódulos em seu repositório para o estado definido (ou seja, verifique a sub-configuração de sub-módulos que foi definida em seu repositório).
Uma maneira melhor seria cd
em seu sub-módulo (que é um repositório Git em si) e simplesmente execute git fetch --tags
e depois git checkout some-tag
. Depois disso, o submódulo foi atualizado em seu diretório de trabalho para some-tag
e você pode encenar isso para cometer.
0 para a resposta № 4
você pode roteirizar para que você faça um (cd path-to-submod && git fetch)
Enrolar os comandos entre parênteses coloca o ambiente em um subshell, ou seja, você não tem que voltar para onde estava.
Espero que isto ajude