Qual é a maneira atual de remover um submódulo git?


92

a partir da versão 1.9.3 do git (Apple Git-50) no mac, como faço para remover um submódulo git? Estou lendo um monte de informações desatualizadas com muitos desenvolvedores me dizendo que não vão funcionar. Qual é a forma atual? vai git deinit pathToSubModule fazer o truque?

As etapas que pensei que funcionariam estão aqui, mas os comentários dizem que não.

Deixe-me explicar minha situação atual e o que preciso fazer. Instalei o repositório Quick e o adicionei como submódulo ao meu projeto. Este código já foi verificado e outros estão usando. O que eu preciso fazer agora é bifurcar o mesmo repositório Quick e hospedá-lo em um github mais seguro que minha empresa tem (ou seja, um github completamente outro privado). Depois de fazer o fork, eu quero adicionar esse fork como um gitSubmodule e deixá-lo substituir o submódulo Quick atual que eu instalei anteriormente.

update: eu li que o seguinte é a maneira correta na última versão do git, por favor, confirme?

To remove a submodule added using:

git submodule add blah@blah.com:repos/blah.git lib/blah
Run:

git rm lib/blah
That's it.

For old versions of git (circa ~1.8.5) use:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah

Eu lutei com problemas de submódulo por dois dias. A descoberta veio quando eu encontrei este: forums.developer.apple.com/thread/13102 . Basicamente, o Xcode, e talvez outros aplicativos, lutam para expandir os urls que contêm '~'. Depois de alterar ssh: //username@server.remoteHost.com/~/git/MyRepo.git para ssh: //username@server.remoteHost.com/home/username/git/MyRepo.git (procure o caminho real no seu servidor), todas as esquisitices desapareceram em dez minutos.
Elise van Looij

Respostas:


196

Você tem a git submodule deinit

git submodule deinit <asubmodule>    
git rm <asubmodule>
# Note: asubmodule (no trailing slash)
# or, if you want to leave it in your working tree
git rm --cached <asubmodule>
rm -rf .git/modules/<asubmodule>

deinit

Cancele o registro dos submódulos fornecidos, ou seja, remova toda asubmodule.$name
seção .git/configjunto com sua árvore de trabalho.

Outras chamadas para git submodule update, git submodule foreache git submodule syncvai ignorar qualquer submódulos não registrados até que eles são inicializados novamente, para usar este comando se você não quer ter um check-out local do sub-módulo na sua árvore de trabalho mais.

Se você realmente deseja remover um submódulo do repositório e comprometer esse uso git rm.

Se --forcefor especificado, a árvore de trabalho do submódulo será removida mesmo que contenha modificações locais.


8
quero eliminar completamente o submódulo para mim e para os outros usuários também. Então, tudo que eu preciso é git submodule deinit asubmodule; e git rm asubmodule ?? E quanto ao submódulo armazenado em cache de outros usuários, eles teriam que excluí-lo depois de puxar para baixo?
j2emanue

1
Eu queria deletar a cópia local do submódulo e funcionou perfeitamente, todos os arquivos do subdiretório sumiram.
malhal,

1
Você também pode precisar rm -rf <asubmodule>se já tiver feito check-out de uma versão do repositório base que cancelou o registro do submódulo.
Sarah Messer

8

Estou usando o Git versão 2.16.2 e git rmexecuta o trabalho muito bem:

git rm path-to-submodule

Você pode verificar com git statuse se git diff --cachedisso desinicializa o submódulo e se modifica .gitmodulesautomaticamente. Como sempre, você precisa confirmar a mudança.

No entanto, mesmo que o submódulo seja removido do controle de origem, .git/modules/path-to-submoduleainda contém o repositório do submódulo e .git/configseu URL, então você ainda precisa removê-los manualmente:

git config --remove-section submodule.path-to-submodule
rm -rf .git/modules/path-to-submodule

Manter o repositório e a configuração do submódulo é intencional para que você possa desfazer a remoção com, por exemplo git reset --hard.


2
resposta mais recente e a solução mais curta
TurboGuma

3

Como remover um submódulo com segurança.

(adiciona a https://stackoverflow.com/a/1260982/342794 )

  1. Liste e localize a seção do submódulo no .gitmodulesarquivo. Diga via terminal vi .gitmodules. Exemplo:

    [submodule "submodules/afnetworking"]
        path = submodules/afnetworking
        url = https://github.com/CompanyName/afnetworking.git
    
  2. Os submódulos podem ser usados ​​com garfos locais. Para projetos de longa execução, o código pode ser diferente do repositório original e pode ter algumas correções. É uma boa ideia verificar se o código do submódulo passou por alterações no decorrer do projeto. Exemplo: Observe os logs, se está apontando para um masterbranch ou algum branch local. explorando logs do git para encontrar modificações que foram feitas via terminal. normalmente, eles são armazenados em um diretório, meu exemplo, em submodulesdiretório.

    User$ cd submodules/afnetworking
    User$ git log
    
  3. Remova a seção de submódulo dos módulos .git e salve o arquivo. Exemplo: git statusdeve mostrar apenas o seguinte como modificado

    modified:   .gitmodules
    
  4. Faça as mudanças com git add .gitmodules.

  5. Liste e localize a seção do submódulo nos .git/configarquivos. Diga via terminal vi .git/config. Exemplo:

    [submodule "submodules/afnetworking"]
        url = https://github.com/CompanyName/afnetworking.git
    
  6. Remova os arquivos sobmodule do cache do git. executando git rm --cached submodules/afnetworking(sem barra final) o removeria com sucesso. Exemplo:

    User$ git rm --cached submodules/afnetworking
    rm 'submodules/afnetworking'    <-- terminal output
    
  7. Remova os arquivos do submódulo no .gitdiretório com rm -rf .git/modules/.... Confirme com git statusdepois.

    User$ rm -rf .git/modules/submodules/afnetworking/
    User$ git status
    On branch feature/replace-afnetworking-submodule-with-pod
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
        modified:   .gitmodules
        deleted:    submodules/afnetworking
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        submodules/afnetworking/
    
  8. Comprometa as mudanças. Confirme com git statusdepois.

    User$ git commit -m "Remove submodule afnetworking"
    [feature/replace-afnetworking-submodule-with-pod 70e239222] Remove submodule afnetworking
    2 files changed, 4 deletions(-)
      delete mode 160000 submodules/afnetworking
    User$ git status
    On branch feature/replace-afnetworking-submodule-with-pod
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        submodules/afnetworking/
    nothing added to commit but untracked files present (use "git add" to track)
    
  9. Exclua os arquivos de submódulo não rastreados.

    User$ rm -rf submodules/afnetworking
    
  10. Exclua as referências do projeto Xcode. Construir, corrigir problemas de compilação e tempo de execução.

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.