Pergunta

Eu tenho um superproject git que faz referência vários submódulos e eu estou tentando bloquear um fluxo de trabalho para o resto dos membros do meu projeto para trabalhar dentro.

Para esta questão, vamos dizer que o meu superproject é chamado supery eo sub-módulo é chamado subby. (Então é uma simplificação do que eu estou tentando fazer ... Eu não estou realmente usando os ramos para as versões, mas eu pensei que seria mais fácil de colocar para fora como uma pergunta.)

Meu branch master de supery tem a v1.0 tag do subby projeto git referenciado como um sub-módulo. O ramo da supery chamado one.one e mudou a referência do sub-módulo para apontar para a v1.1 tag de subby.

Eu posso trabalhar dentro de cada um desses ramos sem problemas, mas se eu tento atualizar o ramo one.one com as alterações do ramo master recebo alguns conflitos e eu não como resolvê-los.

Basicamente depois de executar um git pull . master enquanto no ramo subby, parece que ele cria sub-módulos adicionais.

Antes do pull / merge, eu recebo a resposta desejada a partir git submodule do ramo one.one:

$ git checkout master
$ git submodule
qw3rty...321e subby (v1.0)
$ git checkout one.one
$ git submodule
asdfgh...456d subby (v1.1)

Mas depois a força, ele adiciona submódulos adicionais quando eu corro git submodule:

$ git pull . master
Auto-merged schema
CONFLICT (submodule): Merge conflict in subby - needs qu3rty...321e
Automatic merge failed; fix conflicts and then commit the results.

$ git submodule
qw3rty...321e subby (v1.0)
asdfgh...456d subby (v1.1)
zxcvbn...7890 subby (v1.1~1)

Como faço para excluir / ignorar as referências indesejados submódulo e comprometer meus conflitos e mudanças? Ou há um parâmetro que eu posso usar com meu git pull original que irá ignorar meus submódulos?

Foi útil?

Solução

Eu não vi esse erro exato antes. Mas eu tenho um palpite sobre o problema que você está encontrando. Parece que porque os master e one.one ramos de supery conter diferentes refs para o sub-módulo subby, quando você mesclar as alterações de git master não sabe que ref - v1.0 ou v1.1 -. Devem ser mantidos e monitorados pelo ramo one.one de supery

Se for esse o caso, então você precisa selecionar o árbitro que deseja e se comprometer que a mudança para resolver o conflito. Que é exatamente o que você está fazendo com o reset comando.

Este é um aspecto complicado de acompanhar diferentes versões de um sub-módulo em diferentes ramos de seu projeto. Mas o sub-módulo ref é igual a qualquer outro componente do seu projeto. Se os dois ramos diferentes continuar a acompanhar as mesmas respectivas refs submódulo após fusões sucessivas, então git deve ser capaz de trabalhar fora do padrão, sem levantar conflitos de mesclagem em futuras fusões. Por outro lado, você se refs interruptor submódulo frequentemente você pode ter que aturar um monte de resolver conflitos.

Outras dicas

Bem, seus conflitos não tecnicamente gestão com submódulos (ou seja: manter isso, mas não isso), mas eu encontrei uma maneira de continuar a trabalhar ... e tudo que eu tinha a fazer era prestar atenção à minha saída git status e redefinir os submódulos :

git reset HEAD subby
git commit

Isso seria redefinir o submodule ao pré-pull cometer. Que neste caso é exatamente o que eu queria. E em outros casos onde eu preciso as mudanças aplicadas ao sub-módulo, eu vou lidar com aqueles com os fluxos de trabalho padrão submódulo (master check-out, puxar para baixo o tag desejado, etc).

Eu lutei um pouco com as respostas sobre esta questão e não tem muita sorte com as respostas em um semelhante SO pós quer. Então isto é o que funcionou para mim - tendo em mente que, no meu caso, o sub-módulo foi mantido por uma equipe diferente, por isso o conflito veio de diferentes versões submódulo em master e minha filial local do projeto que eu estava trabalhando em:

  1. Executar git status - anote a pasta submodule com conflitos
  2. Redefinir o sub-módulo para a versão que foi passada cometidos no ramo atual:

    git reset HEAD path/to/submodule

  3. Neste ponto, você tem uma versão livre de conflitos do seu sub-módulo que agora você pode atualizar para a versão mais recente no repositório do sub-módulo:

    cd path/to/submodule
    git submodule foreach git pull origin SUBMODULE-BRANCH-NAME
  4. E agora você pode commit isso e voltar ao trabalho.

Em primeiro lugar, encontrar o hash que você quer para o seu sub-módulo de referência. em seguida, executar

~/supery/subby $ git co hashpointerhere
~/supery/subby $ cd ../
~/supery $ git add subby
~/supery $ git commit -m 'updated subby reference'

que tem trabalhado para me para obter o meu submodule à referência de hash correto e continuar com o meu trabalho sem obter quaisquer conflitos.

Eu tive esse problema com git rebase -i origin/master a um ramo. Eu queria ter a versão de mestre da ref submodule, então eu simplesmente fiz:

git reset master path/to/submodule

e

git rebase --continue

Isso resolveu o problema para mim.

ajuda Got a partir desta discussão. No meu caso o

git reset HEAD subby
git commit

funcionou para mim:)

Bem Na minha diretório pai eu vejo:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Unmerged paths:
(use "git reset HEAD <file>..." to unstage)
(use "git add <file>..." to mark resolution)

Então, eu só fiz isso

git reset HEAD linux
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top