Aqui está parte do conteúdo do meu .gitmodules
arquivo:
[submodule "src/static_management"]
path = src/static_management
url = git://github.com/eykd/django-static-management.git
[submodule "external/pyfacebook"]
path = external/pyfacebook
url = http://github.com/sciyoshi/pyfacebook.git
No entanto, .git/config
contém apenas o primeiro:
[submodule "src/static_management"]
url = git://github.com/eykd/django-static-management.git
O segundo submódulo ( external/pyfacebook
) foi adicionado por outro desenvolvedor em um branch de recurso. Eu herdei o desenvolvimento agora e verifiquei o branch de recursos. No entanto, o Git não puxará o submódulo para mim. Eu tentei:
git submodule init
git submodule update
git submodule update --init
git submodule sync
- Removendo todas as definições de submódulo
.git/config
e em execuçãogit submodule init
. Ele apenas copia o submódulo existente anteriormente e ignora o novo. - Inserindo novas definições de submódulo
.git/config
manualmente e em execuçãogit submodule update
. Apenas os submódulos existentes anteriormente se preocupam em atualizar.
em várias combinações, mas o git simplesmente não atualizará com .git/config
base no novo conteúdo de .gitmodules
, nem criará a external/pyfacebook
pasta e extrairá o conteúdo do submódulo.
o que estou perdendo? A intervenção manual (adicionar uma entrada de submódulo manualmente .git/config
) é realmente necessária e por quê?
Editar: a intervenção manual não funciona. Adicionar manualmente a nova entrada de submódulo .git/config
não faz nada. O novo submódulo é ignorado.
fonte
Respostas:
Você atualizou recentemente para o git versão 1.7.0.4? Eu fiz e agora estou tendo problemas semelhantes ...
Edit: Corrigi meu problema, mas não tenho absolutamente nenhuma ideia de onde estava o problema. Eu removi manualmente as entradas de submódulo de ambos .git / config e .gitmodules e re-adicionei meus submódulos com as etapas usuais (git submodule add etc ...) ... Worksforme mas não adiciona nenhum valor a este tópico.
fonte
Eu tive o mesmo problema - descobriu-se que o arquivo .gitmodules foi confirmado, mas o commit do submódulo real (ou seja, o registro do ID de commit do submódulo) não.
Adicioná-lo manualmente parecia funcionar - por exemplo:
(Mesmo sem remover nada de .git / config ou .gitmodules.)
Em seguida, comprometa-o para registrar o ID corretamente.
Adicionando mais alguns comentários a esta resposta de trabalho: Se o submódulo git init ou atualização do submódulo git não funcionar, então, como descrito acima, o submódulo git add url deve resolver. Pode-se verificar isso por
e deve-se obter uma entrada do submódulo que você deseja obter no resultado do comando git config --list. Se houver uma entrada de seu submódulo no resultado da configuração, agora o submódulo git usual update --init deve puxar seu submódulo. Para testar esta etapa, você pode renomear manualmente o submódulo e atualizá-lo.
Para descobrir se você tem mudanças locais no submódulo, pode ser visto via git status -u (se você quiser ver as mudanças no submódulo) ou git status --ignore-submodules (se você não quiser ver as mudanças no o submódulo).
fonte
external/pyfacebook
?'your/local/path' already exists and is not a valid git repo
git config --list | grep submodule | sed -e "s/submodule\.//" -e "s/\(.*\)\.url=\(.*\)/git submodule add --force \2 \1/" | bash
git versão 2.7.4. Este comando atualiza o código local
git submodule update --init --force --remote
fonte
git submodule update --init --force --remote <module-name>
.Tive o mesmo problema, quando git ignorou
init
eupdate
comanda, e não faz nada.COMO CONSERTAR
Se esses requisitos forem atendidos, funcionará. Caso contrário, todos os comandos serão executados sem nenhuma mensagem e resultado.
Se você fez tudo isso, e ainda assim não funcionar:
git submodule add git@... path/to
git submodule init
git submodule update
.gitmodules
e sua pasta de módulo (observe que o conteúdo da pasta não será confirmado).git/config
ainda não tem submódulosgit submodule init
- e você verá uma mensagem que o módulo registrougit submodule update
- irá buscar o módulo.git/config
e você encontrará o submódulo registradofonte
Parece haver muita confusão aqui (também) nas respostas.
git submodule init
é não pretende gerar magicamente coisas em .git / config (de .gitmodules). A intenção é configurar algo em um subdiretório totalmente vazio após clonar o projeto pai ou puxar um commit que adiciona um submódulo não existente anteriormente.Em outras palavras, você segue a
git clone
de um projeto que tem submódulos (que você saberá pelo fato de que o clone fez check-out de um arquivo .gitmodules) por agit submodule update --init --recursive
.Você não segue
git submodule add ...
com umgit submodule init
(ougit submodule update --init
), isso não deveria funcionar. Na verdade, o add já atualizará o .git / config apropriado se as coisas funcionarem.EDITAR
Se um submódulo git não existente anteriormente foi adicionado por outra pessoa, e você fizer um
git pull
desse commit, então o diretório desse submódulo estará inteiramente vazio (quando você executargit submodule status
o novo hash do submódulo deve estar visível, mas terá um-
na frente de .) Nesse caso, você precisa seguir seugit pull
também com umgit submodule update --init
(mais--recursive
quando é um submódulo dentro de um submódulo) para fazer o check-out do novo submódulo, anteriormente não existente; assim como após um clone inicial de um projeto com submódulos (onde obviamente você não tinha esses submódulos antes também).fonte
git help submodule
diz o seguinte sobre o init: "init: inicializa os submódulos registrados no índice (que foram adicionados e confirmados em outro lugar) copiando os nomes e urls dos submódulos de .gitmodules para .git / config." Então com certeza parece que ele deve fazer exatamente o que você diz que não faz ...? É hora de atualizar a documentação do git?--init
deveria ser necessário obter novos submódulos (em vez de capturá-los automaticamenteupdate
)? Parece que atualizar seu repositório deve pegar tudo o que é necessário, a menos que destrua dados. Com--init
ele o força a saber que novos submódulos podem ter sido criados, ou apenas sempre emitir um a--init
cada vez, caso em que, novamente, parece que ele deve ser habilitado por padrão.Eu tive o mesmo problema, mas nenhuma das soluções acima ajudou. As entradas nos módulos .git e .git / config estavam corretas, mas o comando
git submodules update --init --recursive
não fazia nada. Eu também removi o diretório do submódulo e executeigit submodules update --init --recursive
e recebi o diretório do submódulo de volta, mas com exatamente o mesmo commit de antes.Eu encontrei a resposta nesta página . O comando é:
git submodule update --remote
fonte
git submodule update
vez degit submodule update --remote
.Risca isso. Eu realmente consegui fazer isso funcionar
git submodule update --init --recursive
. Espero que isto ajude.PS: Certifique-se de estar no diretório raiz do git, não no submódulo.
fonte
Pensar que configurar manualmente
.gitmodules
é o suficiente é ERRADOMeu local no
git version 2.22.0
momento desta escrita.Então cheguei a este tópico perguntando por que não estava
git submodule init
funcionando; Eu configurei o.gitmodules
arquivo e continuei a fazergit submodule init
...IMPORTANTE
git submodule add company/project.git includes/project
é necessário (ao adicionar o módulo pela primeira vez), isso irá:.git/config
.gitmodules
arquivoincludes/project
neste exemplo).você deve então,
git commit
depois de adicionar o submódulo, ele irá confirmar.gitmodules
e a localização do submódulo rastreado.Quando o projeto for clonado novamente, ele terá o
.gitmodules
diretório de submódulos e vazio (porincludes/project
exemplo, neste exemplo). Neste ponto,.git/config
ainda não há configuração de submódulo, até quegit submodule init
seja executado, e lembre-se de que isso só funciona porque.gitmodules
ANDincludes/project
são rastreados no repositório git principal.Também para referência, consulte:
fonte
De acordo com a resposta de Dave James Miller, posso confirmar que funcionou para mim. O importante aqui era confirmar o ID de confirmação dos subprojetos. Só ter a entrada em .gitmodules não era suficiente.
Aqui está um commit apropriado:
https://github.com/dirkaholic/vagrant-php-dev-box/commit/d5f4c40bdbd80eefbb5ac6029823733f591435ae
fonte
Eu tive o mesmo problema.
.gitmodules
teve o sub-módulo, mas depois de umgit submodule init
comando que não estava em.git/config
.Acontece que o desenvolvedor que adicionou o submódulo também adicionou o diretório do submódulo ao
.gitignore
arquivo. Isso não funciona.fonte
Da mesma forma que você, descobri que git submodule sync não faz o que você espera. Somente depois de fazer um explícito
git submodule add
novamente é que uma URL de submódulo muda.Então, coloquei este script em
~/bin/git-submodule-sync.rb
:https://gist.github.com/frimik/5125436
E também uso a mesma lógica em alguns scripts git deploy pós-recebimento.
Tudo o que preciso fazer agora é editar
.gitmodules
, executar este script e ele finalmente funcionará como pensei quegit submodule sync
deveria.fonte
Eu tive o mesmo problema hoje e descobri isso porque eu digitei
git submodule init
e tinha essas linhas no meu.git/config
:Eu removi isso e digitei:
E tudo voltou ao normal, meu submódulo atualizado em seu subdiretório como de costume.
fonte
O problema para mim é que o desenvolvedor anterior do repo comprometeu a
submodules/thing
pasta como uma pasta normal, o que significa que quando eu tentei executargit submodule add ...
, ela falhou com:,'submodules/thing' already exists in the index
mas tentar atualizar o submódulo também falhou porque viu que o caminho não contém um submódulo.Para corrigir, eu tive que excluir a
submodules/thing
pasta, confirmar a exclusão e executar ogit submodule add
comando para adicioná-la de volta corretamente:fonte
Quando eu vi isso hoje, um desenvolvedor moveu parte da árvore para um novo subdiretório e parece que seu cliente git não gravou as regras atualizadas do subprojeto na árvore, em vez disso, elas foram apenas nukadas, deixando
.gitmodules
ambos como obsoletos locais e subprojetos que não existiam mais na árvore atual.Adicionando os submódulos de volta e comparando os commit shas do submódulo com aqueles encontrados em
git show $breaking_commit_sha
(procure por linhas que correspondam ao regexp^-Subproject
) para ajustar conforme necessário, coisas fixas.fonte
Excluir o diretório de submódulo e seu conteúdo (pasta "external / pyfacebook") se ele existir antes
git submodule add ...
pode resolver os problemas.fonte
Tive um problema semelhante com um submódulo. Ele só não queria ser clonado / puxado / atualizado / qualquer coisa.
Ao tentar adicionar novamente o submódulo usando
git submodule add [email protected] destination
, obtive a seguinte saída:Portanto, tentei aplicar o comando add :
git submodule add --force [email protected] destination
Isso funcionou no meu caso.
fonte
Para registro:
eu criei o mesmo problema adicionando um repositório vazio como submódulo. Nesse caso, não havia hash de referência disponível para o submódulo, levando ao erro descrito pelo autor original.
A adição forçada do repositório após ter se comprometido com ele resolveu o problema (como na postagem do Arvids)
git submodule add --force [email protected] destination
fonte
.git/config
git submodule init
comandogit pull origin master
Deve funcionar agora
fonte
Apenas compartilhando o que funcionou para mim:
Isso clona o repositório remoto já incluindo os submódulos. Isso significa que você não precisará executar git submodule update ou init após a clonagem.
fonte
O comando de sincronização abaixo resolveu o problema:
fonte