tutorial - update subtree git



Como faço para remover um submódulo? (14)

A maioria das respostas a essa pergunta está desatualizada, incompleta ou desnecessariamente complexa.

Um sub-módulo clonado usando o git 1.7.8 ou mais recente deixará no máximo quatro traços de si mesmo em seu repositório local. O processo para remover esses quatro traços é dado pelos três comandos abaixo:

# Remove the submodule entry from .git/config
git submodule deinit -f path/to/submodule

# Remove the submodule directory from the superproject's .git/modules directory
rm -rf .git/modules/path/to/submodule

# Remove the entry in .gitmodules and remove the submodule directory located at path/to/submodule
git rm -f path/to/submodule

https://code.i-harness.com

Como eu removo um submódulo do Git?

By the way, há uma razão que eu não posso simplesmente fazer git submodule rm whatever ?


Acabei de encontrar o arquivo oculto .submodule (esqueceu o nome exato), ele tem uma lista ... você pode apagá-los individualmente dessa maneira. Eu só tinha um, então eu deletei. Simples, mas pode atrapalhar o Git, já que não sei se algo está ligado ao submódulo. Parece ok até agora, além do problema usual de atualização da libetpan, mas isso (espero) não está relacionado.

Notei que ninguém postou o apagamento manual, então adicionou


Apenas uma nota. Desde o git 1.8.5.2, dois comandos irão fazer:

git rm the_submodule
rm -rf .git/modules/the_submodule

Como a resposta de @Mark Cheverton apontou corretamente, se a segunda linha não for usada, mesmo que você tenha removido o submódulo por enquanto, a pasta remanescente .git / modules / the_submodule impedirá que o mesmo submódulo seja adicionado ou substituído no futuro . Além disso, como @VonC mencionou, git rm fará a maior parte do trabalho em um submódulo.

- Atualização (07/05/2017) -

Só para esclarecer, o the_submodule é o caminho relativo do submódulo dentro do projeto. Por exemplo, ele é subdir/my_submodule se o submódulo estiver dentro de um subdiretório subdir .

Como apontado corretamente nos comentários e outras respostas , os dois comandos (embora funcionalmente suficientes para remover um submódulo), deixam um rastro na seção [submodule "the_submodule"] de .git/config (a partir de julho de 2017), que pode ser removido usando um terceiro comando:

git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null

Aqui está o que eu fiz:

1.) Exclua a seção relevante do arquivo .gitmodules. Você pode usar o comando abaixo:

git config -f .gitmodules --remove-section "submodule.submodule_name"

2.) Estágio as mudanças de .gitmodules

git add .gitmodules

3.) Exclua a seção relevante de .git/config . Você pode usar o comando abaixo:

git submodule deinit -f "submodule_name"

4.) Remova o gitlink (sem barra final):

git rm --cached path_to_submodule

5.) Limpe o .git/modules :

rm -rf .git/modules/path_to_submodule

6.) Commit:

git commit -m "Removed submodule <name>"

7.) Exclua os arquivos do submódulo agora não rastreados

rm -rf path_to_submodule

Através da página Git Submodule Tutorial :

Para remover um submódulo, você precisa:

  1. Exclua a seção relevante do arquivo .gitmodules .
  2. Estágio as mudanças de .gitmodules git add .gitmodules
  3. Exclua a seção relevante de .git/config .
  4. Execute git rm --cached path_to_submodule (sem barra).
  5. Execute rm -rf .git/modules/path_to_submodule
  6. Commit git commit -m "Removed submodule <name>"
  7. Exclua os arquivos submódulos agora não rastreados
    rm -rf path_to_submodule

Veja também : etapas alternativas abaixo .


Depois de experimentar todas as respostas diferentes neste site, acabei com esta solução:

#!/bin/sh
path="$1"
if [ ! -f "$path/.git" ]; then
  echo "$path is no valid git submodule"
  exit 1
fi
git submodule deinit -f $path &&
git rm --cached $path &&
rm -rf .git/modules/$path &&
rm -rf $path &&
git reset HEAD .gitmodules &&
git config -f .gitmodules --remove-section submodule.$path

Isso restaura exatamente o mesmo estado de antes de você adicionar o submódulo. Você pode imediatamente adicionar o submódulo novamente, o que não foi possível com a maioria das respostas aqui.

git submodule add $giturl test
aboveScript test

Isso deixa você com um checkout limpo, sem alterações no commit.

Isso foi testado com:

$ git --version
git version 1.9.3 (Apple Git-50)

Eu achei que deinit funciona bem para mim:

git submodule deinit <submodule-name>    
git rm <submodule-name>

De git docs :

deinir

Cancele o registro dos submódulos fornecidos, isto é, remova todo o submodule.$name seção submodule.$name de .git / config junto com sua árvore de trabalho.


Eu recentemente descobri um projeto git que inclui muitos comandos úteis relacionados ao git: https://github.com/visionmedia/git-extras

Instale e digite:

git-delete-submodule submodule

Então as coisas estão feitas. O diretório do sub-módulo será removido do repositório e ainda existirá em seu sistema de arquivos. Você pode então cometer a mudança como: git commit -am "Remove the submodule" .


O que estou fazendo atualmente em dezembro de 2012 (combina a maioria dessas respostas):

oldPath="vendor/example"
git config -f .git/config --remove-section "submodule.${oldPath}"
git config -f .gitmodules --remove-section "submodule.${oldPath}"
git rm --cached "${oldPath}"
rm -rf "${oldPath}"              ## remove src (optional)
rm -rf ".git/modules/${oldPath}" ## cleanup gitdir (optional housekeeping)
git add .gitmodules
git commit -m "Removed ${oldPath}"

Para remover um submódulo adicionado usando:

git submodule add [email protected]:repos/blah.git lib/blah

Corre:

git rm lib/blah

É isso aí.

Para versões antigas do git (circa ~ 1.8.5) use:

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

Se o submódulo foi acidentalmente adicionado porque você adicionou, confirmou e empurrou uma pasta que já era um repositório Git (continha .git ), você não terá um arquivo .gitmodules para editar, nem nada em .git/config . Neste caso, tudo que você precisa é:

git rm --cached subfolder
git add subfolder
git commit -m "Enter message here"
git push

FWIW , eu também removi a pasta .git antes de fazer o git add .


Se você acabou de adicionar o submódulo e, por exemplo, simplesmente adicionou o submódulo errado ou o adicionou ao local errado, simplesmente git stash depois apague a pasta. Isto supõe que adicionar o submódulo é a única coisa que você fez no repo recente.


Você pode usar um alias para automatizar as soluções fornecidas por outras pessoas:

[alias]
  rms = "!f(){ git rm --cached \"$1\";rm -r \"$1\";git config -f .gitmodules --remove-section \"submodule.$1\";git config -f .git/config --remove-section \"submodule.$1\";git add .gitmodules; }; f"

Coloque isso na sua configuração do git, e então você pode fazer: git rms path/to/submodule


Passos simples

  1. Remova as entradas de configuração:
    git config -f .git/config --remove-section submodule.$submodulename
    git config -f .gitmodules --remove-section submodule.$submodulename
  2. Remova o diretório do índice:
    git rm --cached $submodulepath
  3. Commit
  4. Exclua arquivos não utilizados:
    rm -rf $submodulepath
    rm -rf .git/modules/$submodulename

Por favor note: $submodulepath não contém barras iniciais ou finais.

fundo

Quando você faz o git submodule add , ele apenas o adiciona ao .gitmodules , mas uma vez que você fez o git submodule init , ele foi adicionado ao .git/config .

Então, se você quiser remover os módulos, mas conseguir restaurá-los rapidamente, faça exatamente isso:

git rm --cached $submodulepath
git config -f .git/config --remove-section submodule.$submodulepath

É uma boa idéia fazer git rebase HEAD primeiro e git commit no final, se você colocar isso em um script.

Também dê uma olhada em uma resposta para Posso desovar um submódulo do Git? .





git-submodules