4288 votes

Comment supprimer un sous-module ?

Comment supprimer un sous-module Git ?

Au fait, y a-t-il une raison pour que je ne puisse pas simplement faire git submodule rm whatever ?

121 votes

La réponse simple stackoverflow.com/a/21211232/94687 est maintenant le bon, et devrait être marqué comme tel. Maintenant, c'est simplement git rm modulename y rm -rf .git/modules/modulename

14 votes

En fait, c'est faux. Cette réponse n'aborde pas la question de la suppression de l'entrée du sous-module dans le fichier .git/config . La réponse acceptée montre la manière la plus récente de supprimer complètement un sous-module. Elle est également expliquée de manière plus succincte dans cette réponse : stackoverflow.com/a/36593218/1562138

0 votes

J'ai trouvé cet article très utile pour la suppression des submodules. Il contient des informations sur la suppression des entrées dans les fichiers .gitsubmodules et .git/config. lien

4259voto

John Douthat Points 28189

Via la page Tutoriel sur les sous-modules Git :

Pour supprimer un sous-module, vous devez :

  1. Supprimer la section concernée du .gitmodules fichier.
  2. Mettez en scène le .gitmodules changements :
    git add .gitmodules
  3. Supprimer la section concernée de .git/config .
  4. Supprime les fichiers du sous-module de l'arbre de travail et de l'index :
    git rm --cached path_to_submodule (sans barre oblique).
  5. Supprimez l'étiquette du sous-module .git répertoire :
    rm -rf .git/modules/path_to_submodule
  6. Valider les changements :
    git commit -m "Removed submodule <name>"
  7. Supprimez les fichiers de sous-module maintenant non suivis :
    rm -rf path_to_submodule

Voir aussi : étapes alternatives ci-dessous .

496 votes

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

52 votes

@abernier Une réponse rapide pourrait être "parce qu'une telle commande n'existe pas". Ma supposition est qu'ils essaient de rendre explicite la suppression des fichiers de sous-module par rapport à la configuration du sous-module pour éviter la perte accidentelle de données. Une personne pourrait peut-être penser que git submodule rm supprime simplement l'enregistrement du sous-module, et serait surpris si la commande supprimait également le référentiel local. Toute modification locale serait irrémédiablement perdue. Et peut-être qu'une autre personne penserait que seuls les fichiers seraient supprimés.

137 votes

Franchement, je ne sais pas pourquoi. J'espère qu'ils ajouteront une commande, cependant. Ces 4 étapes sont trop compliquées.

2603voto

VonC Points 414372

Depuis git1.8.3 (22 avril 2013) :

Il n'y avait pas de manière Porcelaine de dire "Je ne suis plus intéressé par ce sous-module", une fois que vous exprimez votre intérêt pour un sous-module avec " git submodule init ".
" git submodule deinit " est le moyen d'y parvenir.

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

Résumé

Le processus de suppression en 3 é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ée par Eonil en les commentaires :

Cela laisse .git/modules/<path-to-submodule>/ inchangé.
Ainsi, si vous supprimez un sous-module avec cette méthode et que vous le réinsérez à nouveau, cela ne sera pas possible car le référentiel a déjà été corrompu.


git rm : Voir commit 95c16418 :

Actuellement, j'utilise " git rm "sur un sous-module supprime l'arbre de travail du sous-module de celui du superprojet et le lien git de l'index.
Mais la section du sous-module dans .gitmodules n'est pas modifié, ce qui est un reliquat du sous-module maintenant supprimé et pourrait irriter les utilisateurs (contrairement au paramètre dans le module .git/config Ceci doit rester comme un rappel que l'utilisateur a montré de l'intérêt pour ce sous-module, donc il sera repeuplé plus tard quand un ancien commit sera extrait).

Laissez " git rm " aident l'utilisateur non seulement en supprimant le sous-module de l'arbre de travail mais aussi en supprimant les " submodule.<submodule name> "de la section .gitmodules le dossier et la scène à la fois.


git submodule deinit : Il découle de ce patch :

Avec " git submodule init "l'utilisateur est en mesure d'indiquer à git qu'il s'intéresse à un ou plusieurs submodules et qu'il souhaite qu'il soit rempli lors du prochain appel à " git submodule update ".
Mais il n'existe actuellement aucun moyen simple de dire à git que l'on ne se soucie plus d'un sous-module et que l'on veut se débarrasser de l'arbre de travail local (à moins que l'utilisateur ne connaisse bien les rouages d'un sous-module et qu'il supprime le " submodule.$name.url Le paramètre " " de .git/config ainsi que l'arbre de travail lui-même).

Aidez ces utilisateurs en leur fournissant un deinit commande.
Ce site supprime l'ensemble submodule.<name> section de .git/config soit pour le(s) sous-module(s) (ou pour tous ceux qui ont été initialisés si ' . est donné).
Échoue si l'arbre de travail actuel contient des modifications, sauf si elles sont forcées.
Se plaindre lorsque pour un sous-module donné sur la ligne de commande, le paramètre url ne peut être trouvé dans .git/config mais n'échouent pas pour autant.

Cela permet d'éviter que les étapes de (dé)initialisation ( .git/config y .git/modules/xxx )

Depuis la version git1.8.5, la fonction git rm prend également le soin de la :

  • ' add qui enregistre l'url d'un sous-module dans le répertoire de l'utilisateur. .gitmodules fichier : il est nécessaire de le supprimer pour vous.
  • le sous-module entrée spéciale (comme illustré par cette question ) : le git rm le supprime de l'index :
    git rm --cached path_to_submodule (sans barre oblique)
    Cela supprimera le 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 comme un répertoire ordinaire, vous obtiendrez un message d'erreur du type :

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

Remarque : depuis Git 2.17 (Q2 2018), le submodule git deinit n'est plus un script de shell.
Il s'agit d'un appel à une fonction C.

Voir commettre 2e61273 , commit 1342476 (14 janvier 2018) par Prathamesh Chavan ( pratham-pc ) .
(fusionné par Junio C Hamano -- gitster -- en commettre ead8dbe , 13 février 2018)

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "$@"

21 votes

Pouvez-vous donner un exemple d'utilisation pour submodule deinit ?

5 votes

@yourfriendzak voici un exemple de quelqu'un qui l'a utilisé avec succès : stackoverflow.com/a/16161950/6309 . Mais gardez à l'esprit que, contrairement à ce que je croyais au départ, la version 1.8.3 n'est pas encore publiée ! Sous Unix, vous pouvez le compiler à partir des sources.

0 votes

D'après mon expérience, git submodule deinit ne supprime pas le répertoire concerné de .git/config . Il reste là jusqu'à ce que je le supprime manuellement.

622voto

Ting L Points 2391

Juste une note. Depuis git 1.8.5.2, deux commandes suffisent :

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

Comme la réponse de @Mark Cheverton l'a correctement souligné, si la deuxième ligne n'est pas utilisée, même si vous avez supprimé le sous-module pour le moment, le dossier .git/modules/the_submodule restant empêchera le même sous-module d'être ajouté ou remplacé à l'avenir. Aussi, 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 qu'elles soient fonctionnellement suffisantes pour supprimer un sous-module) laissent une trace dans le fichier [submodule "the_submodule"] section de .git/config (à partir de juillet 2017), qui peuvent être supprimés à l'aide d'une troisième commande :

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

5 votes

Je suis sur git version 2.4.9 (Apple Git-60) et tout ce que j'ai eu à faire était rm the_submodule. J'ai poussé cela, puis réintroduit un dossier portant le même nom que le sous-module et cela a fonctionné sans problème.

0 votes

Je suis sur git version 2.5.4 sur OSX et vous n'avez besoin de faire la deuxième commande que si vous voulez ré-additionner le sous-module depuis un autre emplacement. Si vous ne faites pas la deuxième étape, vous verrez ceci : Un répertoire git pour 'submodule' a été trouvé localement avec le(s) répertoire(s) distant(s) :

21 votes

Cela ne supprime pas l'entrée du sous-module de l'application .git/config . Voir stackoverflow.com/a/36593218/1562138 pour la manière complète de supprimer un sous-module.

234voto

errordeveloper Points 1649

Des étapes simples

  1. Suppression des entrées de configuration :
    git config -f .git/config --remove-section submodule.$submodulename
    git config -f .gitmodules --remove-section submodule.$submodulename
  2. Supprime le répertoire de l'index :
    git rm --cached $submodulepath
  3. Engagez-vous
  4. Supprimez les fichiers inutilisés :
    rm -rf $submodulepath
    rm -rf .git/modules/$submodulename

Veuillez noter : $submodulepath ne contient pas de barres obliques de début ou de fin.

Contexte

Quand vous le faites git submodule add il ne fait que l'ajouter à .gitmodules mais une fois que tu l'as fait git submodule init il a ajouté à .git/config .

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

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

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

Jetez également un coup d'œil à une réponse à Puis-je dépeupler un sous-module Git ? .

1 votes

J'avais beaucoup de submodules (et un plus grand désordre) et j'ai dû les faire passer par une boucle for. Comme la plupart d'entre eux se trouvaient dans un répertoire spécifique et que la sortie de ls contenait des slashs de fin de ligne. J'ai fait quelque chose comme for dir in directory/*; do git rm --cached $dir; done .

0 votes

Pour obtenir cette liste qui peut être utilisée dans script pour la suppression récursive - git config -f .git/config -l | cut -d'=' -f1 | grep "submodule.$MODPATH" | sed 's/^submodule\.//' | sed 's/\.url$//' - On dirait que tu dois vraiment faire ça au cas où il y aurait un problème, sinon il suffit de git submodule | grep -v '^+' | cut -d' ' -f3

2 votes

Pour obtenir la liste des modules où aucun changement local n'a été effectué - git submodule | grep '^+' | cut -d' ' -f2

85voto

Mark Cheverton Points 1002

En plus des recommandations, j'ai également dû 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 un fork avec l'original)

1 votes

J'avais aussi des problèmes avec ça. Si vous essayez de réinstaller un sous-module sur le même chemin, il garde les informations de branche en cache à l'emplacement que vous avez mentionné, ce qui perturbe les choses.

0 votes

Merci, j'en avais besoin aussi. @Anton, je suis d'accord, et j'ai modifié la réponse la plus votée pour ajouter cette information.

0 votes

J'ai utilisé l'option --name pour que le remplacement fonctionne... voir stackoverflow.com/questions/14404704/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X