Como faço para substituir um submódulo git por outro repo?

96

Como substituo um submódulo git por um repo git diferente?

Especificamente, tenho um submódulo:

  • localizado em ./ExternalFrameworks/TestFramework naquele ponto para um repo git[email protected]:userA/TestFramework.git
  • Eu gostaria agora de apontar para [email protected]:userB/TestFramework.git .

O problema é que quando eu deleto o submódulo com o método descrito aqui , então o adiciono novamente usando o comando

git submodule add [email protected]:userB/TestFramework.git

Eu recebo este erro:

A git directory for 'ExternalFrameworks/TestFramework' is found locally with remote(s):
  origin    [email protected]:userA/TestFramework.git
If you want to reuse this local git directory instead of cloning again from
  [email protected]:userB/TestFramework.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.
joseph.hainline
fonte
1
possível duplicata de Changing remote repository for a git submodule
jiyinyiyong

Respostas:

123

Se a localização (URL) do submódulo mudou, você pode simplesmente:

  1. Modifique seu .gitmodulearquivo para usar o novo URL
  2. Exclua a pasta do submódulo no repo rm -rf .git/modules/<submodule>
  3. Exclua a pasta do submódulo no diretório de trabalho rm -rf <submodule>
  4. Corre git submodule sync
  5. Corre git submodule update

Informações mais completas podem ser encontradas em outro lugar:

Tim Henigan
fonte
4
Também vale a pena notar: quando outro usuário (que já havia iniciado o submódulo) receber sua atualização, ele também terá que fazer a "sincronização do submódulo git" uma vez antes que o novo submódulo funcione para eles.
joseph.hainline
2
Isto não funcionou para mim. Meu submódulo ainda apontava para o URL antigo depois disso. Alguma ideia por quê?
Arne
34
@Arne Talvez seu submódulo nunca tenha sido inicializado corretamente. Eu tinha que fazer rm -rf .git/modules/<submodule>isso antes de funcionar para mim.
David Braun
@DavidBraun Eu tenho o mesmo problema que @Arne apesar de fazer git submodule syncdepois de rm -rf .git/modules/<submodule>dar fatal: Not a git repository: ../.git/modules/<submodule>. Alguma dica? Eu inicialmente criei o submódulo via de git submodule add https://<submodule-url>acordo com os documentos do git ...
acannon828
1
Depois disso, eu tive que fazer o cd para o diretório do módulo, git checkout o branch que eu quero, então git pull.
Nicolas Raoul
34

Primeiro, exclua o submódulo atual com o método já mencionado aqui , que estou incluindo por conveniência:

  • Exclua a seção relevante do .gitmodulesarquivo
  • Exclua a seção relevante de .git/config
  • Executar git rm --cached path_to_submodule(sem barra final)
  • Confirme e exclua os arquivos de submódulo agora não rastreados

Agora, adicione o novo submódulo com a --namebandeira. Isso dará ao git um nome alternativo para fazer referência .git/configao submódulo, para desconsiderar o submódulo que estava lá historicamente, que você ainda deseja trabalhar em seu histórico anterior.

Então digite:

git submodule add --name UpdatedTestFramework [email protected]:userB/TestFramework.git

e você terá o submódulo carregado no caminho que você espera.

joseph.hainline
fonte
2
Embora essa maneira funcione, não é tão limpa quanto o método de Tim.
joseph.hainline
4
Isso funcionou para mim, mas eu também tive que excluir .git/modules/<path_to_submodule>.
Nate
1
Agradeço a referência a --name. Eu não estava ciente dos problemas relacionados a isso e não fui capaz de substituir um submódulo até que fiz uso desta opção (graças à sua resposta).
aknuds1
Este acabou sendo o único método que funcionou para mim, porém eu queria manter o mesmo nome de diretório. Ele fez o checkout do caminho correto e tornou o nome do módulo o nome desejado, mas o nome do diretório de trabalho era o novo nome do repo. Portanto, se você deseja o mesmo nome, também precisa especificar isso no final da url, da seguinte forma: git submodule add --name old-name-to-keep [email protected]:userB/new-repository.git old-name-to-keep
rgb
8

Esses comandos farão o trabalho no prompt de comando sem alterar nenhum arquivo no repositório local.

git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git
git config --file=.gitmodules submodule.Submod.branch Dev
git submodule sync
git submodule update --init --recursive --remote
Pavan Sokke Nagaraj
fonte
5

O que consertou isso para mim foi na raiz do seu repositório git (não no submódulo), execute

rm -rf .git/modules/yourmodule

Então você deve ser capaz de adicionar normalmente.

hobberwickey
fonte
3

A maneira mais fácil que encontrei é esta:

git rm -rf [submodule_dir]
git submodule add --name new_[submodule_name] [new_submodule_url] [submodule_dir]

Não gostei da ideia de modificar o meu .gitmodulesmanualmente. Eu também escrevi uma pequena postagem no blog sobre isso.

DerZyklop
fonte
2

Se você deseja alterar o URL remoto apenas para este clone :

git config submodule."$submodule_name".url "$new_url"

Isso não afetará o .gitmodulesarquivo no projeto pai, portanto não será propagado para outros desenvolvedores.

Isso é descrito como "alterações de registro específicas do usuário" aqui .

Não execute,git submodule syncpois isso redefinirá para o URL padrão novamente.

joeytwiddle
fonte