Eu estou usando submódulos Git. Depois de extrair alterações do servidor, muitas vezes meu cabeçalho do submodulo é desanexado da ramificação principal.
Por que isso acontece?
Eu tenho que fazer sempre:
git branch
git checkout master
Como posso garantir que meu submódulo esteja sempre apontando para o ramo principal?
git
git-submodules
om471987
fonte
fonte
Respostas:
EDITAR:
Consulte @Simba Answer para obter uma solução válida
RESPOSTA ANTIGA:
Pessoalmente, eu odeio respostas aqui que direcionam para links externos que podem parar de funcionar com o tempo e verifique minha resposta aqui (a menos que a pergunta seja duplicada) - direcionando para a pergunta que cobre o assunto entre as linhas de outro assunto, mas no geral é igual a: "Estou não responder, leia a documentação ".
Então, voltando à pergunta: por que isso acontece?
Situação que você descreveu
Este é um caso comum quando não se usa submódulos com muita frequência ou apenas se inicia com submódulos . Acredito que estou correto ao afirmar que todos já estivemos lá em algum momento em que o HEAD do nosso submódulo é desanexado.
Solução: verifique se o submódulo está rastreando a ramificação correta
Solução: Faça seu submódulo rastrear sua ramificação remota adicionando novos submódulos com os dois comandos a seguir.
<branch>
.Nos casos mais comuns, você já corrigiu agora o seu CABEÇOTE DETALHADO, pois estava relacionado a um dos problemas de configuração acima.
fixação da CABEÇA DESTACADA quando
.update = checkout
Mas se você conseguiu fazer algumas alterações localmente já para o submódulo e confirmado, envie-as para remoto, quando você executar o 'git checkout', o Git notificará você:
A opção recomendada para criar uma ramificação temporária pode ser boa e, em seguida, você pode mesclar essas ramificações etc. No entanto, eu pessoalmente usaria apenas
git cherry-pick <hash>
neste caso.Embora existam mais casos, você pode colocar seus submódulos no estado DETACHED HEAD, espero que você entenda agora um pouco mais sobre como depurar seu caso específico.
fonte
git submodule update --remote
. Por favor, dê uma olhada na resposta de Simba, acho que deve ser a resposta certa.Adicionando uma
branch
opção em.gitmodule
se não relacionadas ao comportamento individual de submódulos em tudo. A resposta antiga de @mkungla está incorreta ou obsoleta.De
git submodule --help
, HEAD desanexado é o comportamento padrão degit submodule update --remote
.Primeiro, não há necessidade de especificar um ramo a ser rastreado .
origin/master
é o ramo padrão a ser rastreado.Por quê
Então, por que o HEAD é destacado depois
update
? Isto é causado pelo comportamento de atualização do módulo padrão:checkout
.Para explicar esse estranho comportamento de atualização, precisamos entender como funcionam os submódulos?
Citação de Começando com submódulos no livro Pro Git
O repositório principal rastreia o submódulo com seu estado em um ponto específico , o ID de confirmação . Portanto, quando você atualiza os módulos, está atualizando o ID de confirmação para um novo.
Quão
Se você deseja que o submódulo seja mesclado automaticamente com a ramificação remota, use
--merge
ou--rebase
.Tudo que você precisa fazer é,
Alias recomendado:
Há também uma opção para criar
--merge
ou--rebase
como o comportamento padrãogit submodule update
, configurandosubmodule.$name.update
paramerge
ourebase
.Aqui está um exemplo sobre como configurar o comportamento de atualização padrão da atualização do submódulo em
.gitmodule
.Ou configure-o na linha de comando,
Referências
git submodule --help
fonte
git submodule update --remote --merge
, e ele puxa o submódulo em um estado desanexado. Também tentei--rebase
com o mesmo resultado.cd
no submódulo, faça o checkout do submódulo para um ramo específico comgit checkout master
,.git submodule foreach --recursive git checkout master
.git submodule foreach --recursive git checkout master
. Mas como posso impedir que o git sempre os desanexe? Definir opções de configuração para cada submódulo não é uma opção!git submodule update --remote --merge
não deixou o submódulo em um estado HEAD desanexado, mas a execuçãogit submodule update
após editar meu.gitmodule
arquivo, como você indicou, deixou o submódulo em um estado HEAD desanexado.Eu cansei disso sempre desconectando, então eu apenas uso um script de shell para construí-lo para todos os meus módulos. Eu assumo que todos os submódulos estão no master: aqui está o script:
execute-o a partir do seu módulo pai
fonte
Confira minha resposta aqui: Sub-módulos Git: especifique uma ramificação / tag
Se desejar, você pode adicionar a linha "branch = master" ao seu arquivo .gitmodules manualmente. Leia o link para ver o que quero dizer.
EDIT: Para rastrear um projeto de submódulo existente em uma filial, siga as instruções do VonC aqui:
Sub-módulos Git: especifique uma ramificação / tag
fonte
branch = master" line into your .gitmodule
é de fato a resposta completa, resolveu esse problema para mim.A outra maneira de fazer com que seu submódulo verifique a ramificação é acessar o
.gitmodules
arquivo na pasta raiz e adicionar o campobranch
na configuração do módulo da seguinte maneira:branch = <branch-name-you-want-module-to-checkout>
fonte
branch = my_wanted_branch
. Mas executá-git submodule update --remote
lo ainda faz check-out como cabeça destacada.Como outras pessoas disseram, a razão pela qual isso acontece é que o repositório pai contém apenas uma referência a (o SHA1 de) um commit específico no submódulo - ele não sabe nada sobre ramificações. É assim que deve funcionar: o ramo que estava naquele commit pode ter avançado (ou retrocedido) e, se o repositório pai tiver feito referência ao branch, ele poderá ser interrompido facilmente quando isso acontecer.
No entanto, especialmente se você estiver desenvolvendo ativamente no repositório pai e no submódulo, o
detached HEAD
estado pode ser confuso e potencialmente perigoso. Se você fizer confirmações no submódulo enquanto estiver nodetached HEAD
estado, elas ficarão pendentes e você poderá facilmente perder seu trabalho. (Os envios dangling geralmente podem ser resgatados usandogit reflog
, mas é muito melhor evitá-los em primeiro lugar.)Se você é como eu, na maioria das vezes, se há uma ramificação no submódulo que aponta para o check-out do commit, você prefere fazer check-out desse branch do que estar no estado HEAD desanexado no mesmo commit. Você pode fazer isso adicionando o seguinte alias ao seu
gitconfig
arquivo:Agora, depois de fazer,
git submodule update
você só precisa chamargit submodule-checkout-branch
, e qualquer submódulo com check-out em um commit que tem um ramo apontando para ele fará check-out desse ramo. Se você não costuma ter várias ramificações locais, todas apontando para o mesmo commit, isso geralmente fará o que você deseja; caso contrário, pelo menos, garantirá que quaisquer confirmações efetuadas sejam enviadas para uma ramificação real, em vez de ficar penduradas.Além disso, se você configurou o git para atualizar automaticamente os submódulos no checkout (usando
git config --global submodule.recurse true
, veja esta resposta ), você pode criar um gancho pós-checkout que chama esse alias automaticamente:Então você não precisa chamar um
git submodule update
ougit submodule-checkout-branch
, apenasgit checkout
o update atualiza todos os submódulos para seus respectivos commits e verifica as ramificações correspondentes (se existirem).fonte
A solução mais simples é:
Em seguida, cd no diretório repo e:
Leitura adicional: práticas recomendadas dos submódulos do Git .
fonte