Eu sou novo no git e gostaria de receber ajuda para adicionar submódulos. Recebi dois projetos compartilhando algum código comum. O código compartilhado foi copiado nos dois projetos. Criei um repositório git separado para o código comum e o removi dos projetos com o plano de adicioná-lo como um submódulo git.
Eu usei a opção de caminho do sub-módulo git add para especificar a pasta:
git submodule add url_to_repo projectfolder
mas entendi o erro:
'projectfolder' already exists in the index"
Esta é a estrutura desejada do meu repositório:
repo
|-- projectfolder
|-- folder with common code
É possível adicionar o submódulo git diretamente no repositório ou em uma nova pasta, mas não na pasta do projeto. O problema é que ele realmente precisa estar na pasta do projeto. O que posso fazer sobre isso e o que entendi errado sobre a opção de caminho da adição do sub-módulo git?
git
git-submodules
Vanja
fonte
fonte
git ls-files --stage projectfolder
?git rm
na pasta existente ajudou: |Respostas:
Receio que não haja informações suficientes na sua pergunta para ter certeza do que está acontecendo, já que você não respondeu à minha pergunta de acompanhamento, mas isso pode ajudar em qualquer caso.
Esse erro significa que
projectfolder
já está preparado ("já existe no índice"). Para descobrir o que está acontecendo aqui, tente listar tudo no índice nessa pasta com:A primeira coluna dessa saída informará que tipo de objeto está no índice em
projectfolder
. (Eles se parecem com os modos de arquivo Unix, mas têm significados especiais no git.)Eu suspeito que você verá algo como:
(ou seja, uma linha que começa com
160000
); nesse caso, o repositórioprojectfolder
já foi adicionado como um "gitlink". Se ele não aparecer na saída degit submodule
e você deseja adicioná-lo novamente como um submódulo, você pode:... para desfilar e depois:
... para adicionar o repositório como um submódulo.
No entanto, também é possível que você veja muitos blobs listados (com modos de arquivo
100644
e100755
), o que sugere que você não desassociou os arquivos corretamenteprojectfolder
antes de copiar o novo repositório no lugar. Se for esse o caso, você pode fazer o seguinte para desestabilizar todos esses arquivos:... e adicione o submódulo com:
fonte
projectfolder
não continha um.git
diretório. Pareceu sua pergunta como se você tivesse criado o novo repositório paraprojectfolder
outro lugar e o copiado no lugar, mas claramente não era esse o caso. Você precisaria mover o existenteprojectfolder
para fora do caminho e, em seguida, copiar o novo repositório (completo com seu.git
diretório) antes de adicionar como um submódulo. Ou, se você já o empurrou para o repositório representado porurl_to_repo
, bastaprojectfolder
sair do caminho e adicionar o submódulo a partir desse URL.A remoção manual do submódulo envolve várias etapas e isso funcionou para mim.
Supondo que você esteja no diretório raiz do projeto e que o exemplo do nome do módulo git seja "c3-pro-ios-framework"
Remova os arquivos associados ao submódulo
Remova todas as referências ao submódulo na configuração
Remova os .gitmodules
Remova-o do cache sem o "git"
Adicionar submódulo
fonte
git submodule
após a remoção e antes da adição e isso causou um erro.touch .gitmodules
(precisa estar na árvore de trabalho, removê-lo ajuda. Mas você precisa adicioná-lo novamente). Awesome post btw. A única coisa que funcionou aqui..git
diretório que ainda tinha restos para mim. Isso funcionou muito bem. Obrigado.Você precisa remover o repositório git do submódulo (pasta de projeto neste caso) primeiro para o caminho git.
e depois adicione o submódulo
fonte
git submodule add --force <git_submodule_repository>
trabalhou para mim manter o mesmo nome submoduleEu tive o mesmo problema e depois de horas procurando encontrei a resposta.
O erro que eu estava recebendo era um pouco diferente:
<path> already exists and is not a valid git repo
(e adicionado aqui para o valor de SEO)A solução é NÃO criar o diretório que hospedará o submódulo. O diretório será criado como parte do
git submodule add
comando.Além disso, espera-se que o argumento seja relativo à raiz do repositório pai, não ao seu diretório de trabalho, portanto, tenha cuidado com isso.
Solução para o exemplo acima:
common_code
diretório não existe.cd Repo
git submodule add git://url_to_repo projectfolder/common_code/
( Observe a barra à direita necessária ) .Espero que isso ajude alguém, pois há muito pouca informação em outro lugar sobre isso.
fonte
git submodule add
e a barra final não é necessária.se existir uma pasta nomeada
x
sob controle git, você deseja adicionar um submódulo com o mesmo nome, exclua a pastax
e a confirme primeiro .Atualizado por @ ujjwal-singh:
Não é necessário confirmar, a preparação é suficiente.
git add
/git rm -r
fonte
git add
/gir rm -r
Apenas para esclarecer na linguagem humana o que o erro está tentando lhe dizer:
Você não pode criar um repositório nesta pasta que já tenha rastreado no repositório principal.
Por exemplo: Você tem uma pasta de tema chamada
AwesomeTheme
repositório dedicado, tenta despejá-la diretamente no repositório principalgit submodule add sites/themes
e obtém isso"AwesomeTheme" index already exists
.Você só precisa garantir que ainda não exista um
sites/themes/AwesomeTheme
no rastreamento de versão do repositório principal, para que o submódulo possa ser criado lá.Portanto, para corrigir, em seu repositório principal, se você tiver um
sites/theme/AwesomeTheme
diretório vazio , remova-o. Se você já fez commits com osites/theme/AwesomeTheme
diretório em seu repositório principal, precisará limpar todo o histórico dele com um comando como este:Agora você pode correr
git submodule add [email protected] sites/themes/AwesomeTheme
Como o repositório principal nunca viu nada (também conhecido como indexado)
sites/themes/AwesomeTheme
antes, agora pode criá-lo.fonte
Eu consegui fazê-lo fazendo o contrário. Começando com um repositório vazio, adicionando o submódulo em uma nova pasta chamada "projectfolder / common_code". Depois disso, foi possível adicionar o código do projeto na pasta do projeto. Os detalhes são mostrados abaixo.
Em um repo vazio, digite:
Isso criará a estrutura de pastas desejada:
Agora é possível adicionar mais submódulos, e o código do projeto pode ser adicionado à pasta do projeto.
Ainda não sei dizer por que funcionou dessa maneira e não da outra.
fonte
Não sei se isso é útil, embora eu tenha tido o mesmo problema ao tentar confirmar meus arquivos no IntelliJ 15. No final, abri o SourceTree e lá poderia simplesmente confirmar o arquivo. Problema resolvido. Não é necessário emitir nenhum comando git sofisticado. Apenas mencioná-lo no caso de alguém ter o mesmo problema.
fonte
Vá para a pasta do repositório. Exclua os submódulos relevantes de .gitmodules. Selecione mostrar arquivos ocultos. Vá para a pasta .git, exclua os submódulos da pasta do módulo e configure.
fonte
Isso acontece se o arquivo .git estiver ausente no caminho de destino. Isso aconteceu comigo depois que eu executei
git clean -f -d
.Eu tive que excluir todas as pastas de destino exibidas na mensagem e depois executar
git submodule update --remote
fonte
No seu diretório git, suponha que você sincronize todas as alterações.
Então faça:
fonte