Quelle est la manière actuelle de supprimer un sous-module git?

91

à partir de la version 1.9.3 de git (Apple Git-50) sur mac, comment supprimer un sous-module git? Je lis beaucoup d'informations obsolètes et de nombreux développeurs me disent qu'ils ne fonctionneront pas. Quelle est la manière actuelle? fera git deinit pathToSubModule l'affaire?

Les étapes que je pensais fonctionner sont ici, mais les commentaires disent que non

Laissez-moi vous expliquer ma situation actuelle et ce que j'ai besoin d'accomplir. J'ai installé le référentiel rapide et l' ai ajouté en tant que sous-module à mon projet. Ce code est déjà enregistré et d'autres l'utilisent. Ce que je dois maintenant faire est de créer le même dépôt rapide et de l'héberger sur un github plus sécurisé que mon entreprise possède (donc un tout autre github privé). Après l'avoir forgé, je veux ajouter ce fork en tant que gitSubmodule et le laisser remplacer le sous-module Quick actuel que j'avais installé précédemment.

mise à jour: j'ai lu que ce qui suit est le bon moyen sur la dernière version de git, veuillez confirmer?

To remove a submodule added using:

git submodule add [email protected]: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
j2emanue
la source
J'ai lutté contre des problèmes de sous-modules pendant deux jours. La percée est venue quand j'ai trouvé ceci: forums.developer.apple.com/thread/13102 . Fondamentalement, Xcode, et peut-être d'autres applications, ont du mal à développer les URL contenant '~'. Une fois que j'ai changé ssh: //[email protected]/~/git/MyRepo.git en ssh: //[email protected]/home/username/git/MyRepo.git (recherchez le chemin réel sur votre serveur), toute la bizarrerie a disparu en dix minutes.
Elise van Looij

Réponses:

193

Tu as le 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

Désenregistrez les sous-modules donnés, c'est-à-dire supprimez lasubmodule.$name
section entière.git/config avec leur arbre de travail.

D' autres appels à git submodule update, git submodule foreachet git submodule syncne sauter aucun sous - modules non enregistrés jusqu'à ce qu'ils soient initialisés à nouveau, utilisez donc cette commande si vous ne voulez pas avoir une caisse locale du sous - module dans votre arbre de travail plus.

Si vous voulez vraiment supprimer un sous-module du référentiel et valider cette utilisation à la git rmplace.

Si --forceest spécifié, l'arborescence de travail du sous-module sera supprimée même si elle contient des modifications locales.

CodeWizard
la source
8
Je veux effacer complètement le sous-module pour moi et les autres utilisateurs également. Donc tout ce dont j'ai besoin est git submodule deinit asubmodule; et git rm asubmodule ?? Et qu'en est-il du sous-module mis en cache par les autres utilisateurs, devraient-ils le supprimer après l'avoir retiré?
j2emanue
1
Je voulais supprimer la copie locale du sous-module et cela a fonctionné parfaitement, tous les fichiers du sous-répertoire ont disparu.
malhal
1
Vous devrez peut-être également rm -rf <asubmodule>si vous avez déjà extrait une version du référentiel de base qui a désenregistré le sous-module.
Sarah Messer
6

J'utilise la version 2.16.2 de Git et je fais git rmtrès bien le travail:

git rm path-to-submodule

Vous pouvez vérifier avec git statuset git diff --cachedque cela désinitialise le sous-module et se modifie .gitmodulesautomatiquement. Comme toujours, vous devez valider le changement.

Cependant, même si le sous-module est supprimé du contrôle de code source, .git/modules/path-to-submoduleil contient toujours le référentiel de sous-modules et .git/configcontient son URL, vous devez donc toujours les supprimer manuellement:

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

Conserver le référentiel et la configuration du sous-module est intentionnel afin que vous puissiez annuler la suppression avec par exemple git reset --hard.

mrts
la source
1
réponse la plus récente et la solution la plus courte
TurboGuma
3

Comment supprimer en toute sécurité un sous-module.

(ajoute à https://stackoverflow.com/a/1260982/342794 )

  1. Répertoriez et localisez la section du sous-module dans le .gitmodulesfichier. Dites via le terminal vi .gitmodules. Exemple:

    [submodule "submodules/afnetworking"]
        path = submodules/afnetworking
        url = https://github.com/CompanyName/afnetworking.git
    
  2. Les sous-modules peuvent être utilisés avec des fourches locales. Pour les projets de longue durée, le code peut différer du dépôt d'origine et peut avoir des correctifs. C'est une bonne idée de vérifier si le code du sous-module a subi des modifications au cours du projet. Exemple: regardez les journaux, s'ils pointent vers une masterbranche ou une branche locale. explorer les journaux git pour trouver les modifications effectuées via le terminal. généralement ceux-ci sont stockés dans un répertoire, mon exemple, sous submodulesrépertoire.

    User$ cd submodules/afnetworking
    User$ git log
    
  3. Supprimez la section de sous-module de .gitmodules, enregistrez le fichier. Exemple: git statusne doit afficher que les éléments suivants comme modifiés

    modified:   .gitmodules
    
  4. Mettez en scène les changements avec git add .gitmodules.

  5. Répertoriez et localisez la section du sous-module dans les .git/configfichiers. Dites via le terminal vi .git/config. Exemple:

    [submodule "submodules/afnetworking"]
        url = https://github.com/CompanyName/afnetworking.git
    
  6. Supprimez les fichiers sobmodule du cache git. l'exécution git rm --cached submodules/afnetworking(pas de barre oblique finale) le supprimerait avec succès. Exemple:

    User$ git rm --cached submodules/afnetworking
    rm 'submodules/afnetworking'    <-- terminal output
    
  7. Supprimez les fichiers du sous-module sous le .gitrépertoire avec rm -rf .git/modules/.... Confirmez-le par la git statussuite.

    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. Validez les modifications. Confirmer par la git statussuite.

    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. Supprimez les fichiers de sous-module non suivis.

    User$ rm -rf submodules/afnetworking
    
  10. Supprimez les références du projet Xcode. Construisez, corrigez les problèmes de compilation et d'exécution.

lal
la source