Problema ao adicionar código comum como submódulo git: "já existe no índice"


225

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?


O que você ganha se você faz git ls-files --stage projectfolder?
Mark Longair

Posso obter uma lista com todos os partida contentar com 100644.
Vanja


8
para mim, fazendo um git rmna pasta existente ajudou: |
Rogerdpack 20/09/16

Respostas:


343

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 projectfolderjá está preparado ("já existe no índice"). Para descobrir o que está acontecendo aqui, tente listar tudo no índice nessa pasta com:

git ls-files --stage projectfolder

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:

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

(ou seja, uma linha que começa com 160000); nesse caso, o repositório projectfolderjá foi adicionado como um "gitlink". Se ele não aparecer na saída de git submodulee você deseja adicioná-lo novamente como um submódulo, você pode:

git rm --cached projectfolder

... para desfilar e depois:

git submodule add url_to_repo projectfolder

... 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 100644e 100755), o que sugere que você não desassociou os arquivos corretamente projectfolderantes de copiar o novo repositório no lugar. Se for esse o caso, você pode fazer o seguinte para desestabilizar todos esses arquivos:

git rm -r --cached projectfolder

... e adicione o submódulo com:

git submodule add url_to_repo projectfolder

13
Obrigado Mark pela sua resposta detalhada. Eu fiz uma "pasta de projeto git rm -r --cached" e tentei att o submódulo novamente. No entanto, desta vez, recebo o erro rmessage "'projectfolder' já existe e não é um repositório git válido".
21412 Vanja

3
@ Vanja: Isso indica que projectfoldernão continha um .gitdiretório. Pareceu sua pergunta como se você tivesse criado o novo repositório para projectfolderoutro lugar e o copiado no lugar, mas claramente não era esse o caso. Você precisaria mover o existente projectfolderpara fora do caminho e, em seguida, copiar o novo repositório (completo com seu .gitdiretório) antes de adicionar como um submódulo. Ou, se você já o empurrou para o repositório representado por url_to_repo, basta projectfoldersair do caminho e adicionar o submódulo a partir desse URL.
Mark Longair

incrível resposta +1 todo o caminho
abbood

Isso me ajudou muito. Obrigado!
Evan Moran

1
Isso foi o que fiz, que é o processo de 3 etapas. PASSO 1: git rm -r --cached src / test / resources /, PASSO 2: removemos o diretório de recursos existentes para outro local, PASSO 3: submodule git add add url_to_repo src / teste / recursos
vikramvi 30/01

52

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

rm -rf .git/modules/c3-pro-ios-framework/

Remova todas as referências ao submódulo na configuração

vim .git/config

insira a descrição da imagem aqui

Remova os .gitmodules

rm -rf .gitmodules

Remova-o do cache sem o "git"

git rm --cached c3-pro-ios-framework

Adicionar submódulo

git submodule add https://github.com/chb/c3-pro-ios-framework.git

2
Ótimo post, funciona muito bem. Que bom que você compartilhou, senhor. Muito bom.
precisa saber é o seguinte

1
Tentei listar os submódulos git submoduleapós a remoção e antes da adição e isso causou um erro.
mehmet

1
Eu votaria este 50x se pudesse; você acabou de salvar meu dia!
Sensei James

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.
Torxed 01/10/19

Era o .gitdiretório que ainda tinha restos para mim. Isso funcionou muito bem. Obrigado.
Kevin Anderson

44

Você precisa remover o repositório git do submódulo (pasta de projeto neste caso) primeiro para o caminho git.

rm -rf projectfolder

git rm -r projectfolder

e depois adicione o submódulo

git submodule add <git_submodule_repository> projectfolder

4
git submodule add --force <git_submodule_repository>trabalhou para mim manter o mesmo nome submodule
Tenfrow

1
Obrigado!! Não precisei adicionar a pasta do projeto, apenas mudei para o subdiretório e os clones a partir daí.
Tony Fraser

32

Eu 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 addcomando.

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:

  1. Não há problema em ter seu repo pai já clonado.
  2. Verifique se o common_codediretório não existe.
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/( Observe a barra à direita necessária ) .
  5. Sanidade restaurada.

Espero que isso ajude alguém, pois há muito pouca informação em outro lugar sobre isso.


1
A etapa 4 deve começar git submodule adde a barra final não é necessária.
nullability

Corrigido o erro de digitação. Testei novamente, e a barra à direita fez a diferença para mim. Estou usando o zsh se isso tiver algum efeito.
undefined

Isso resolveu meu problema (criando o diretório com o comando add submódulo add), obrigado!
precisa saber é o seguinte

18

se existir uma pasta nomeada xsob controle git, você deseja adicionar um submódulo com o mesmo nome, exclua a pasta xe a confirme primeiro .

Atualizado por @ ujjwal-singh:

Não é necessário confirmar, a preparação é suficiente. git add/git rm -r


O compromisso foi o que eu perdi. Resposta curta, mas correta!
Qqwy

3
A confirmação não é necessária, a preparação é suficiente. git add/gir rm -r
Ujjwal Singh

3

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 AwesomeThemerepositório dedicado, tenta despejá-la diretamente no repositório principal git submodule add sites/themese obtém isso "AwesomeTheme" index already exists.

Você só precisa garantir que ainda não exista um sites/themes/AwesomeThemeno 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/AwesomeThemediretório vazio , remova-o. Se você já fez commits com o sites/theme/AwesomeThemediretório em seu repositório principal, precisará limpar todo o histórico dele com um comando como este:

git filter-branch --index-filter \
              'git rm -r --cached --ignore-unmatch sites/theme/AwesomeTheme'     HEAD

Agora você pode correr git submodule add git@AwesomeTheme.repowhateverurlthing sites/themes/AwesomeTheme

Como o repositório principal nunca viu nada (também conhecido como indexado) sites/themes/AwesomeThemeantes, agora pode criá-lo.


1

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:

git submodule add url_to_repo projectfolder/common_code

Isso criará a estrutura de pastas desejada:

repo
|-- projectfolder
    |-- common_code

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.


0

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.


0

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.


0

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


-18

No seu diretório git, suponha que você sincronize todas as alterações.

rm -rf .git 

rm -rf .gitmodules

Então faça:

git init
git submodule add url_to_repo projectfolder

2
isso excluirá todo o histórico do projeto!
Redbandit 28/11/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.