Comment puis-je supprimer un sous-module?

Comment supprimer un sous-module Git?

au fait, y a-t-il une raison pour laquelle je ne peux pas simplement faire git submodule rm whatever ?

3057
demandé sur Luca Kiebel 2009-08-11 18:31:24

21 réponses

depuis git1.8.3 (22 avril 2013) :

il n'y avait pas de façon en porcelaine de dire" Je ne suis plus intéressé par ce sous-module", une fois que vous exprimez votre intérêt dans un sous-module avec " submodule init ".

" submodule deinit " est la façon de le faire.

le processus de suppression utilise également git rm (depuis git1.8.5 octobre 2013).

résumé

le processus de suppression en trois étapes serait alors:

0. mv a/submodule a/submodule_tmp

1. git submodule deinit -f -- a/submodule    
2. rm -rf .git/modules/a/submodule
3. git rm -f a/submodule
# Note: a/submodule (no trailing slash)

# or, if you want to leave it in your working tree and have done step 0
3.   git rm --cached a/submodule
3bis mv a/submodule_tmp a/submodule

explication

rm -rf : ceci est mentionné dans Daniel Schroeder 's réponse , et résumé par Eonil dans les commentaires :

cela laisse .git/modules/<path-to-submodule>/ inchangé.

Donc, si vous supprimez une fois un sous-module avec cette méthode et le rajoutez à nouveau, ce ne sera pas possible parce que le dépôt a déjà été corrompu.


git rm : voir commit 95c16418 :

utilise actuellement " git rm " sur un sous-module enlève l'arbre de travail du sous-module de celui du superproject et le gitlink de l'index.

Mais la section du sous-module dans .gitmodules n'est pas touchée, ce qui est un reliquat du sous-module maintenant enlevé et pourrait irriter les utilisateurs (par opposition au réglage dans .git/config , cela doit rester comme un rappel que l'Utilisateur a montré de l'intérêt pour ce sous-module afin qu'il sera repeuplé plus tard quand une commit plus ancienne est cochée).

Let " git rm " aider l'utilisateur non seulement en enlevant le sous-module de l'arbre de travail, mais aussi suppression de la section" submodule.<submodule name> " du fichier .gitmodules et mise en scène des deux.


git submodule deinit : il provient de ce patch :

Avec " git submodule init ", l'utilisateur est en mesure d'indiquer à git ils se soucient de l'un ou de plusieurs submodules et veut l'avoir renseigné sur le prochain appel à " git submodule update ".

Mais actuellement, il n'est pas facile ils peuvent dire git qu'ils ne se soucient plus d'un sous-module et veulent se débarrasser de l'arbre de travail local (à moins que l'utilisateur sait beaucoup sur les internes de sous-module et supprime le " submodule.$name.url " réglage de .git/config avec l'arbre de travail lui-même).

aider ces utilisateurs en fournissant un ' deinit ' commandement.

Ce supprime la totalité de la section submodule.<name> de la section .git/config , soit: le sous-module(s) (ou pour tous ceux qui ont été initialisé si ' . est donné).

Échouer si l'arbre de travail actuel contient des modifications à moins d'être forcé.

Se plaindre quand pour un sous-module donné sur la ligne de commande le réglage d'url ne peut pas être trouvé dans .git/config , mais néanmoins ne pas échouer.

cela prend soin si les étapes d'initialisation (de) ( .git/config et .git/modules/xxx )

depuis git1.8.5, le git rm prend aussi soin du:

  • ' add ' étape qui enregistre l'url d'un sous-module dans le fichier .gitmodules : il est nécessaire de le supprimer pour vous.
  • le sous-module mention spéciale (comme illustré par les cette question ): le git rm supprime de l'index:

    git rm --cached path_to_submodule (pas de barre oblique)

    Cela supprimera ce répertoire stocké dans l'index avec un mode spécial "160000", le marquant comme un répertoire racine de sous-module.

Si vous oubliez cette dernière étape, et essayez d'ajouter ce qui était un sous-module régulier répertoire, vous obtiendrez un message d'erreur comme:

git add mysubmodule/file.txt 
Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'

Note: depuis Git 2.17 (Q2 2018), git sous-module deinit n'est plus un script shell.

C'est un appel à une fonction C.

Voir commettre 2e61273 , commettre 1342476 (14 janvier 2018) par Prathamesh Chavan ( pratham-pc ) .

(fusionné par Junio CA Hamano -- gitster -- in commit ead8dbe , 13 fév 2018)

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "$@"
1822
répondu VonC 2018-02-18 18:33:57

Via la page tutoriel de sous-module Git :

pour supprimer un sous-module, vous devez:

  1. supprimer la section pertinente du fichier .gitmodules .
  2. "1519190920 de la" Scène .gitmodules modifications git add .gitmodules
  3. supprimer la section pertinente de .git/config .
  4. Exécuter git rm --cached path_to_submodule (pas de slash.)
  5. Exécuter rm -rf .git/modules/path_to_submodule
  6. Commit git commit -m "Removed submodule <name>"
  7. supprimer les fichiers submodules Non tracés

    rm -rf path_to_submodule

Voir aussi : autres étapes au-dessous de .

3168
répondu John Douthat 2018-01-05 10:56:34

juste une note. Depuis git 1.8.5.2, deux commandes feront:

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

comme @Mark Cheverton L'a souligné à juste titre, si la deuxième ligne n'est pas utilisée, même si vous avez enlevé le sous-module pour l'instant, le reste .git / modules / le dossier_submodule empêchera le même sous-module d'être ajouté ou remplacé à l'avenir. En outre, comme @VonC l'a mentionné, git rm fera la plupart du travail sur un sous-module.

--mise à jour (07/05/2017)--

juste pour clarifier, the_submodule est le chemin relatif du sous-module à l'intérieur du projet. Par exemple, c'est subdir/my_submodule si le sous-module est à l'intérieur d'un sous-répertoire subdir .

comme indiqué correctement dans les commentaires et autres réponses , les deux commandes (bien que fonctionnellement suffisantes pour supprimer un sous-module), ne laisser une trace dans la section [submodule "the_submodule"] de .git/config (à partir de juillet 2017), qui peut être supprimé en utilisant une troisième commande:

git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null
353
répondu tinlyx 2017-07-06 03:03:50

la majorité des réponses à cette question sont périmées, incomplètes ou inutilement complexes.

un sous-module cloné à l'aide de git 1.7.8 ou plus récent laissera au plus quatre traces de lui-même dans votre repo local. Le processus pour enlever ces quatre traces est donné par les trois commandes ci-dessous:

# 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
272
répondu fvgs 2017-05-21 06:31:44

étapes Simples

  1. supprimer les entrées de configuration:

    git config -f .git/config --remove-section submodule.$submodulename

    git config -f .gitmodules --remove-section submodule.$submodulename
  2. Supprimer répertoire de l'index:

    git rm --cached $submodulepath
  3. Commit
  4. supprimer les fichiers non utilisés:

    rm -rf $submodulepath

    rm -rf .git/modules/$submodulename

s'il vous Plaît note: $submodulepath ne contient pas de leader ou de barres obliques.

arrière-plan

Quand vous faites git submodule add , il ajoute que .gitmodules , mais une fois que vous avez fait git submodule init , il a ajouté à .git/config .

Donc, si vous souhaitez supprimer les modules, mais être en mesure de restaurer rapidement, alors, faites ceci:

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

It est une bonne idée de faire git rebase HEAD d'abord et git commit à la fin, si vous le mettez dans un script.

aussi jeter un oeil à une réponse à est-ce que je peux désopuler un sous-module Git? .

187
répondu errordeveloper 2017-05-24 05:06:17

en plus des recommandations, j'ai aussi eu à rm -Rf .git/modules/path/to/submodule pour pouvoir ajouter un nouveau sous-module avec le même nom (dans mon cas je remplaçais une fourchette avec l'original)

81
répondu Mark Cheverton 2016-04-21 11:36:26

vous devez supprimer l'entrée dans .gitmodules et .git/config , et supprimer le répertoire du module de l'histoire:

git rm --cached path/to/submodule

si vous écrivez sur la liste de diffusion de git probablement quelqu'un fera un script shell pour vous.

47
répondu Carmine Paolino 2011-12-28 15:01:28

pour supprimer un sous-module ajouté en utilisant:

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

Run:

git rm lib/blah

C'est ça.

Pour les anciennes versions de git (vers ~1.8.5):

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah
47
répondu Doug 2014-07-03 05:44:03

vous pouvez utiliser un alias pour automatiser les solutions fournies par d'autres:

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

mettez ça dans votre git config, et ensuite vous pouvez faire: git rms path/to/submodule

41
répondu Charles 2012-11-01 21:43:37

pour résumer, voici ce que vous devez faire:

  1. Set path_to_submodule var (no trailing slash):

    path_to_submodule=path/to/submodule

  2. supprimer la ligne correspondante du .gitmodules fichier:

    git config -f .gitmodules --remove-section submodule.$path_to_submodule

  3. supprimer la section pertinente .git / config

    git config -f .git/config --remove-section submodule.$path_to_submodule

  4. Unstage et supprimer $path_to_submodule seulement à partir de l'index (pour éviter de perdre de l'information)

    git rm --cached $path_to_submodule

  5. Suivi des modifications apportées .gitmodules

    git add .gitmodules

  6. Commettre le superproject

    git commit -m "Remove submodule submodule_name"

  7. Supprimer les fichiers submodules Non tracés

    rm -rf $path_to_submodule

    rm -rf .git/modules/$path_to_submodule

39
répondu luissquall 2016-04-21 11:36:43

si le sous-module était accidentellement ajouté parce que vous avez ajouté, engagé et poussé un dossier qui était déjà un dépôt Git (contenu .git ), vous n'aurez pas de fichier .gitmodules à éditer, ou quoi que ce soit dans .git/config . dans ce cas, tout ce dont vous avez besoin est:

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

FWIW , j'ai aussi enlevé le dossier .git avant de faire le dossier git add .

36
répondu Oli Studholme 2016-04-21 11:36:34

après avoir expérimenté avec toutes les réponses différentes sur ce site, j'ai fini avec cette solution:

#!/bin/sh
path=""
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

cela rétablit le même état qu'avant l'ajout du sous-module. Vous pouvez ajouter les sous-module de nouveau, ce qui n'était pas possible avec la plupart des réponses ici.

git submodule add $giturl test
aboveScript test

cela vous laisse avec une caisse propre sans aucun changement à commettre.

ceci a été testé avec:

$ git --version
git version 1.9.3 (Apple Git-50)
21
répondu udondan 2015-01-21 09:43:01

Ce que je fais actuellement Déc 2012 (combine la plupart de ces réponses):

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}"
17
répondu Lance Rushing 2012-12-18 22:50:23

j'ai trouvé deinit fonctionne bien pour moi:

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

à Partir de git docs :

deinit

ne pas enregistrer les sous-Règles données, c.-à-d. supprimer le tout submodule.$name la section de .git / config avec leur arbre de travail.

17
répondu Damjan Pavlica 2017-02-09 01:53:37

j'ai récemment découvert un projet git qui comprend de nombreuses commandes utiles liées à git: https://github.com/visionmedia/git-extras

installez-le et tapez:

git-delete-submodule submodule

alors les choses sont faites. Le répertoire submodule sera supprimé de votre repo et existera toujours dans votre système de fichiers. Vous pouvez alors effectuer le changement comme: git commit -am "Remove the submodule" .

13
répondu Chien-Wei Huang 2016-04-21 11:36:59

voici ce que j'ai fait:

1.) Supprimer la section pertinente du .fichier gitmodules. Vous pouvez utiliser la commande suivante:

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

2.) Étape .gitmodules changements

git add .gitmodules

3.) Supprimer la section pertinente de .git/config . Vous pouvez utiliser la commande suivante:

git submodule deinit -f "submodule_name"

4.) Retirez le gitlink (pas de slash):

git rm --cached path_to_submodule

5.) Nettoyage le .git/modules :

rm -rf .git/modules/path_to_submodule

6. S'engagent:

git commit -m "Removed submodule <name>"

7.) Supprimer le maintenant sans traces sous-module fichiers

rm -rf path_to_submodule
12
répondu Ishan Liyanage 2016-04-21 11:37:22

J'ai dû prendre les pas de John Douthat un peu plus loin et cd dans le répertoire du sous-module, puis supprimer le dépôt Git:

cd submodule
rm -fr .git

alors je pourrais propager les fichiers en tant que partie du dépôt git parent sans l'ancienne référence à un sous-module.

10
répondu Kyle Clegg 2013-03-09 11:42:42
project dir:     ~/foo_project/
submodule:       ~/foo_project/lib/asubmodule
- - - - - - - - - - - - - - - - - - - - - - - - -
run:
  1.   cd ~/foo_project
  2.   git rm lib/asubmodule && 
          rm .git/modules/lib/asubmodule && 
            git submodule lib/asubmodule deinit --recursive --force
7
répondu 2015-04-18 04:38:27

je viens de trouver le .submodule (nom exact oublié) fichier caché, il a une liste... vous pouvez les effacer individuellement de cette façon. Je viens d'en prendre un, alors je l'ai effacé. C'est Simple, mais ça pourrait faire foirer Git, puisque je ne sais pas si quelque chose est attaché au sous-module. Semble ok jusqu'à présent, en dehors de la question de mise à niveau habituelle de libetpan, mais c'est (espérons-le) sans rapport.

N'a remarqué aucune effacement manuel, donc ajouté

7
répondu Stephen J 2016-04-21 11:37:13

Voici les 4 étapes que j'ai trouvé nécessaires ou utiles (importantes d'abord):

git rm -f the_submodule
rm -rf .git/modules/the_submodule
git config -f .git/config --remove-section submodule.the_submodule
git commit -m "..."

En théorie , git rm dans étape 1 doit prendre soin d'elle. Espérons que la deuxième partie de L'OP question pourra un jour recevoir une réponse positive (que cela puisse être fait en une seule commande).

mais à partir de juillet 2017, étape 2 est nécessaire pour supprimer les données dans .git/modules/ dans le cas contraire, vous ne pouvez pas par exemple ajouter le sous-module à l'avenir.

vous pouvez probablement vous en tirer avec les deux étapes ci-dessus pour git 1.8.5+ comme réponse de tinlyx noté, comme toutes les commandes git submodule semblent fonctionner.

L'Étape 3 supprime la section pour the_submodule dans le fichier .git/config . Cela devrait être fait pour l'exhaustivité. (L'entrée peut causer des problèmes pour les versions plus anciennes de git, mais je n'en ai pas un à tester).

pour cela, la plupart des réponses suggèrent d'utiliser git submodule deinit . Je trouve qu'il est plus explicite et moins déroutant d'utiliser git config -f .git/config --remove-section . Selon la documentation git-submodule , git deinit :

désinscrire Les sous-Règles données ... Si vous voulez vraiment supprimer un submodule du dépôt et commit qui utilisent git-rm[1] au lieu de .

Last mais surtout, si vous ne faites pas git commit , vous obtiendrez / pouvez obtenir une erreur en faisant git submodule summary (à partir de git 2.7):

fatal: Not a git repository: 'the_submodule/.git'
* the_submodule 73f0d1d...0000000:

peu importe que vous fassiez les étapes 2 ou 3.

6
répondu laser 2017-07-01 18:05:06

si vous venez d'ajouter le sous-module, et par exemple, vous avez simplement ajouté le mauvais sous-module ou vous l'avez ajouté au mauvais endroit, faites simplement git stash puis supprimez le dossier. Cela suppose que l'ajout du sous-module est la seule chose que vous avez fait dans le récent repo.

4
répondu botbot 2016-06-01 08:35:20