Question Comment supprimer un sous-module?


Comment supprimer un sous-module Git?

En passant, y a-t-il une raison pour laquelle je ne peux pas simplement faire

git submodule rm whatever

?


3019
2017-08-11 14:31


origine


Réponses:


Depuis git1.8.3 (22 avril 2013):

Il n'y avait pas de façon de dire en porcelaine "Je ne suis plus intéressé par ce sous-module", une fois que vous exprimez votre intérêt pour un sous-module avec "submodule init".
  "submodule deinit"est le moyen 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 Schroederde répondreet résumée par Eonil dans les commentaires:

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


git rm: Voir commettre 95c16418:

Actuellement en train d'utiliser "git rm"sur un sous-module supprime l'arbre de travail du sous-module de celui du superprojet et le gitlink de l'index.
  Mais la section du sous-module dans .gitmodules est laissée intacte, ce qui est un reste du sous-module maintenant supprimé et pourrait irriter les utilisateurs (par opposition à la mise en .git/config, ceci doit rester comme un rappel que l'utilisateur a montré de l'intérêt pour ce sous-module afin qu'il soit repeuplé plus tard quand un commit plus ancien est extrait).

Laisser "git rm"aider l'utilisateur en supprimant non seulement le sous-module de l'arbre de travail, mais aussi en supprimant le"submodule.<submodule name>"section du .gitmodules classer et mettre en scène les deux.


git submodule deinit: Cela vient de ce patch:

Avec "git submodule init"l'utilisateur est capable de dire à git qu'il se soucie d'un ou plusieurs sous-modules et veut le faire apparaître lors du prochain appel"git submodule update".
  Mais actuellement, il n'y a pas de moyen facile de dire à git qu'il ne se soucie plus d'un sous-module et qu'il veut se débarrasser de l'arbre de travail local (à moins que l'utilisateur en sache beaucoup sur les sous-modules et supprime lesubmodule.$name.url"réglage de .git/config avec l'arbre de travail lui-même).

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

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

Depuis git1.8.5, le git rm prend aussi soin de:

  • 'addétape qui enregistre l'URL d'un sous-module dans le .gitmodules fichier: il est nécessaire de 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(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 sous-module.

Si vous oubliez cette dernière étape et que vous essayez d'ajouter un sous-module en tant que répertoire normal, vous obtiendrez un message d'erreur du type:

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

Note: depuis Git 2.17 (Q2 2018), git submodule deinit n'est plus un script shell.
C'est un appel à une fonction C.

Voir commenter 2e61273, commenter 1342476 (14 janv. 2018) par Prathamesh Chavan (pratham-pc).
(Fusionné par Junio ​​C Hamano - gitster - dans 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} "$@"

1796
2018-04-23 05:57



Via la page Didacticiel de sous-module Git:

Pour supprimer un sous-module, vous devez:

  1. Supprimer la section pertinente de la .gitmodules fichier.
  2. Stage le .gitmodules changements git add .gitmodules
  3. Supprimer la section pertinente de .git/config.
  4. Courir git rm --cached path_to_submodule (pas de barre oblique)
  5. Courir rm -rf .git/modules/path_to_submodule
  6. Commettre git commit -m "Removed submodule <name>"
  7. Supprimer les fichiers de sous-module maintenant non suivis
    rm -rf path_to_submodule

Voir également: étapes alternatives ci-dessous.


3144
2018-01-18 23:30



Juste une note. Depuis git 1.8.5.2, deux commandes vont faire:

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

Comme la réponse de @Mark Cheverton l'indique correctement, si la deuxième ligne n'est pas utilisée, même si vous avez supprimé le sous-module pour l'instant, le reste .git / modules / the_submodule empêchera le même sous-module d'être ajouté ou remplacé à l'avenir . Aussi, comme @VonC 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 dans un sous-répertoire subdir.

Comme indiqué correctement dans les commentaires et d'autres réponses, les deux commandes (bien que fonctionnellement suffisant pour supprimer un sous-module), laisser une trace dans le [submodule "the_submodule"] section 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

331
2018-04-13 08:51



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

Un sous-module cloné en utilisant git 1.7.8 ou plus récent laissera au plus quatre traces de lui-même dans votre dépôt local. Le processus pour supprimer 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

244
2018-03-02 16:07



É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 le répertoire de l'index:
    git rm --cached $submodulepath
  3. Commettre
  4. Supprimer les fichiers inutilisés:
    rm -rf $submodulepath
    rm -rf .git/modules/$submodulename

Notez s'il vous plaît:  $submodulepath ne contient pas de barres obliques avant ou arrière.

Contexte

Quand tu fais git submodule add, il l'ajoute seulement à .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 le restaurer rapidement, alors faites juste 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 premier et git commit à la fin, si vous mettez cela dans un script.

Regardez aussi une réponse à Puis-je dépeupler un sous-module Git?.


183
2017-08-11 14:43



En plus des recommandations, je devais aussi rm -Rf .git/modules/path/to/submodule pouvoir ajouter un nouveau sous-module avec le même nom (dans mon cas, je remplaçais une fourche par l'original)


80
2017-10-12 10:17



Vous devez supprimer l'entrée dans .gitmodules et .git/configet supprimez le répertoire du module de l'historique:

git rm --cached path/to/submodule

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


46
2017-11-01 21:43



Pour supprimer un sous-module ajouté en utilisant:

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

Courir:

git rm lib/blah

C'est tout.

Pour les anciennes versions de git (circa ~ 1.8.5), utilisez:

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

45
2017-07-09 17:55



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

[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"

Mettez cela dans votre config git, et alors vous pouvez faire: git rms path/to/submodule


40
2018-05-16 09:27



Pour résumer, voici ce que vous devriez faire:

  1. Ensemble path_to_submodule var (pas de barre oblique finale):

    path_to_submodule=path/to/submodule

  2. Supprimez la ligne pertinente du fichier .gitmodules:

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

  3. Supprimer la section pertinente de .git / config

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

  4. Dissocier et supprimer $ path_to_submodule uniquement de l'index (pour éviter de perdre des informations)

    git rm --cached $path_to_submodule

  5. Suivi des modifications apportées à .gitmodules

    git add .gitmodules

  6. Commettre le superprojet

    git commit -m "Remove submodule submodule_name"

  7. Supprimer les fichiers de sous-module maintenant non suivis

    rm -rf $path_to_submodule

    rm -rf .git/modules/$path_to_submodule


38
2017-10-22 10:54