Como git submodule add -b
funciona?
Após adicionar um submódulo com uma ramificação específica, um novo repositório clonado (após git submodule update --init
) estará em uma consolidação específica, não a ramificação propriamente dita ( git status
no submódulo mostra "Atualmente não está em nenhuma ramificação").
Não consigo encontrar nenhuma informação sobre .gitmodules
ou .git/config
sobre a ramificação do submódulo ou qualquer confirmação específica, então como o Git descobre isso?
Além disso, é possível especificar uma tag em vez de uma ramificação?
Estou usando a versão 1.6.5.2.
git
git-submodules
Ivan
fonte
fonte
Respostas:
Nota: O Git 1.8.2 adicionou a possibilidade de rastrear ramificações. Veja algumas das respostas abaixo.
É um pouco confuso se acostumar com isso, mas os submódulos não estão em um ramo. Eles são, como você diz, apenas um ponteiro para um commit específico do repositório do submódulo.
Isso significa que, quando alguém faz check-out no seu repositório, ou extrai seu código e faz a atualização do sub-módulo git, o sub-módulo é retirado do check-out para esse commit específico.
Isso é ótimo para um submódulo que não muda com frequência, porque todos no projeto podem ter o submódulo no mesmo commit.
Se você deseja mover o submódulo para uma tag específica:
Em seguida, outro desenvolvedor que deseja ter submodule_directory alterado para essa tag, faz isso
git pull
alterações às quais confirmam seus diretórios de submodule.git submodule update
na verdade mescla o novo código.fonte
cd my_submodule; git checkout [ref in submodule's repository
rendimentosfatal: reference is not a tree: ...
. É como segit
apenas operasse no repositório pai.git checkout v1.0
um ramo ou uma etiqueta?Gostaria de adicionar uma resposta aqui que é realmente apenas um conglomerado de outras respostas, mas acho que pode ser mais completa.
Você sabe que possui um submódulo Git quando possui essas duas coisas.
Você
.gitmodules
tem uma entrada assim:Você tem um objeto submodule (chamado SubmoduleTestRepo neste exemplo) em seu repositório Git. O GitHub mostra esses objetos como "submódulo". Ou faça a
git submodule status
partir de uma linha de comando. Os objetos do submódulo Git são tipos especiais de objetos Git e mantêm as informações do SHA para uma confirmação específica.Sempre que você fizer um
git submodule update
, ele preencherá seu submódulo com o conteúdo da confirmação. Ele sabe onde encontrar o commit por causa das informações no.gitmodules
.Agora, tudo o que
-b
faz é adicionar uma linha no seu.gitmodules
arquivo. Então, seguindo o mesmo exemplo, ficaria assim:O objeto submodule ainda está apontando para uma confirmação específica. A única coisa que a
-b
opção compra é a capacidade de adicionar um--remote
sinalizador à sua atualização de acordo com a resposta de Vogella:Em vez de preencher o conteúdo do submódulo para o commit apontado pelo submódulo, ele substitui esse commit pelo último commit no branch master, ENTÃO ele preenche o submódulo com esse commit. Isso pode ser feito em duas etapas pela resposta djacobs7. Como você atualizou o commit que o objeto do sub-módulo está apontando, você deve confirmar o objeto do sub-módulo alterado no seu repositório Git.
git submodule add -b
não é uma maneira mágica de manter tudo atualizado com uma filial. Simplesmente adiciona informações sobre uma ramificação no.gitmodules
arquivo e oferece a opção de atualizar o objeto submódulo para a confirmação mais recente de uma ramificação especificada antes de preenchê-lo.fonte
.gitmodules
e, após isso$ git submodule update --init --remote TestModule
, recebi um erro dizendo:fatal: Needed a single revision
eUnable to find current origin/TestTag revision in submodule path 'TestModule'
. Ao fazê-lo com um ramo real, ele funciona. Existe uma maneira de especificar uma tag.gitmodules
sem precisar especificar a confirmação exata?.gitmodules
e corrigit submodule update
e nada aconteceu?(Git 2.22, Q2 2019, lançado
git submodule set-branch --branch aBranch -- <submodule_path>
)Observe que se você possui um submódulo existente que ainda não está rastreando uma ramificação , então ( se você tiver o git 1.8.2+ ):
Verifique se o repositório pai sabe que seu submódulo agora rastreia uma ramificação:
Verifique se o seu submódulo é realmente o mais tardar nesse ramo:
(com 'origin' sendo o nome do repositório remoto upstream do qual o submódulo foi clonado.
Uma parte
git remote -v
interna desse submódulo o exibirá. Geralmente, é 'origin')Não se esqueça de registrar o novo estado do seu submódulo no repositório pai:
A atualização subsequente para esse submódulo precisará usar a
--remote
opção:Observe que, com o Git 2.10+ (terceiro trimestre de 2016), você pode usar '
.
' como um nome de filial:Mas, como comentado por LubosD
Isso significa Git 2.23 (agosto de 2019) ou mais.
Consulte " Confundido por
git checkout
"Se você deseja atualizar todos os seus submódulos seguindo uma ramificação:
Observe que o resultado, para cada submódulo atualizado, quase sempre será um HEAD desanexado , como Dan Cameron observou em sua resposta .
( Clintm observa nos comentários que, se você executar
git submodule update --remote
e o sha1 resultante for o mesmo que o ramo em que o submódulo está atualmente, ele não fará nada e deixará o submódulo ainda "nesse ramo" e não no estado principal desanexado. )Para garantir que o ramo seja realmente retirado (e que não modifique o SHA1 da entrada especial que representa o submódulo do repositório pai), ele sugere:
Cada submódulo ainda fará referência ao mesmo SHA1, mas se você fizer novos commit, poderá empurrá-los porque eles serão referenciados pela ramificação que você deseja que o submódulo rastreie.
Após esse envio dentro de um submódulo, não se esqueça de voltar ao repositório pai, adicionar, confirmar e enviar o novo SHA1 para esses submódulos modificados.
Observe o uso de
$toplevel
, recomendado nos comentários de Alexander Pogrebnyak .$toplevel
foi introduzido no git1.7.2 em maio de 2010: commit f030c96 .dtmland
adiciona nos comentários :O mesmo comando, mas mais fácil de ler:
umläute refina o comando do dtmland com uma versão simplificada nos comentários :
várias linhas:
Antes do Git 2.26 (primeiro trimestre de 2020), uma busca orientada a buscar atualizações recursivamente nos submódulos inevitavelmente produz resmas de saída, e fica difícil identificar mensagens de erro.
O comando foi ensinado a enumerar submódulos que apresentavam erros no final da operação .
Veja commit 0222540 (16 de janeiro de 2020) por Emily Shaffer (
nasamuffin
) .(Incorporado por Junio C Hamano -
gitster
- in commit b5c71cc , 5 de fevereiro de 2020)fonte
foreach
script não dependerá do código codificado<path>
, se você substituir<path>
por$toplevel/
.foreach
script falhará ao fazer o check-out de submódulos que não seguem uma ramificação. No entanto, este comando fornece os dois:git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git checkout $branch'
git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
git submodule update --remote --merge
ougit submodule update --remote --rebase
. Esses comandos fazem o rastreamento da ramificação remota.O Git 1.8.2 adicionou a possibilidade de rastrear ramificações.
Veja também submódulos Git
fonte
.gitmodules
arquivo?git submodule add -b tags/<sometag> <url>
o qual você pode ver como a linhabranch = tags/<sometag>
em.gitmodules
Um exemplo de como eu uso os submódulos do Git.
E isso se parece um pouco com isso:
Talvez ajude (mesmo que eu use uma tag e não um ramo)?
fonte
git reset --hard V3.1.2
? Acabei de receber um "nada a confirmar" com umgit status
do diretório pai.Na minha experiência, alternar ramificações no superprojeto ou nos checkouts futuros ainda causará CAUSAS desmembradas dos submódulos, independentemente de o submódulo ser adicionado e rastreado adequadamente (por exemplo, respostas @ djacobs7 e @Johnny Z).
E, em vez de verificar manualmente a ramificação correta manualmente ou por meio de um sub-módulo git de script, pode-se usar cada um.
Isso verificará o arquivo de configuração do sub-módulo para a propriedade branch e fará check-out do branch set.
git submodule foreach -q --recursive 'branch="$(git config -f <path>.gitmodules submodule.$name.branch)"; git checkout $branch'
fonte
Os submódulos do Git são um pouco estranhos - eles sempre estão no modo "cabeça desanexada" - não são atualizados para o commit mais recente em um ramo, como você poderia esperar.
Isso faz algum sentido quando você pensa sobre isso, no entanto. Digamos que eu crie um repositório foo com a barra do submódulo . Eu envio minhas alterações e digo para você conferir o commit a7402be do repositório foo .
Imagine que alguém comete uma alteração na barra do repositório antes que você possa fazer seu clone.
Quando você faz o check-out do commit a7402be do repositório foo , espera obter o mesmo código que enviei. É por isso que os submódulos não são atualizados até que você diga explicitamente e faça um novo commit.
Pessoalmente, acho que os submódulos são a parte mais confusa do Git. Existem muitos lugares que podem explicar melhor os submódulos do que eu. Eu recomendo o Pro Git de Scott Chacon.
fonte
git clone git://github.com/git/git.git
e empurre esse recurso ...? = DPara alternar ramificação para um submódulo (supondo que você já tenha o submódulo como parte do repositório):
cd
raiz do seu repositório que contém os submódulos.gitmodules
para ediçãopath = ...
eurl = ...
digabranch = your-branch
: para cada submódulo; salvar arquivo.gitmodules
.$ git submodule update --remote
... isso deve receber as confirmações mais recentes na ramificação especificada, para cada submódulo assim modificado.
fonte
Eu tenho isso no meu arquivo .gitconfig. Ainda é um rascunho, mas provou ser útil a partir de agora. Isso me ajuda a sempre recolocar os submódulos em suas ramificações.
fonte
Nós usamos o Quack para extrair um módulo específico de outro repositório Git. Precisamos extrair código sem toda a base de código do repositório fornecido - precisamos de um módulo / arquivo muito específico desse enorme repositório e deve ser atualizado sempre que executarmos a atualização.
Então, conseguimos isso desta maneira:
Criar configuração
Com a configuração acima, ele cria um diretório a partir do repositório GitHub fornecido, conforme especificado na configuração do primeiro módulo, e o outro é extrair e criar um arquivo a partir do repositório fornecido.
Outros desenvolvedores só precisam executar
E ele extrai o código das configurações acima.
fonte
O único efeito de escolher uma ramificação para um submódulo é que, sempre que você passar o
--remote
opção nagit submodule update
linha de comando, o Git fará check-out no modo HEAD desanexado (se o--checkout
comportamento padrão for selecionado) a confirmação mais recente dessa ramificação remota selecionada .Você deve ter um cuidado especial ao usar esse recurso de rastreamento remoto de ramificação para sub-módulos Git se trabalhar com clones rasos de sub-módulos. A ramificação escolhida para esse fim nas configurações do submódulo NÃO É aquela que será clonada durante
git submodule update --remote
. Se você também passar o--depth
parâmetro e não instruir o Git sobre qual ramificação você deseja clonar - e na verdade você não pode nagit submodule update
linha de comando !! -, ele implicitamente se comportará como explicado nagit-clone(1)
documentação paragit clone --single-branch
quando o--branch
parâmetro explícito estiver ausente e, portanto , clonará apenas o ramo primário .Sem surpresa, após o estágio de clone executado pelo
git submodule update
comando, ele finalmente tentará verificar a confirmação mais recente do ramo remoto que você configurou anteriormente para o submódulo e, se esse não for o principal , não fará parte do processo. seu clone raso local e, portanto, falhará comfonte
sub-módulo git add -b develop --name branch-name - https: //branch.git
fonte