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
?
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
?
Via la page Tutoriel sur les sous-modules Git :
Pour supprimer un sous-module, vous devez :
.gitmodules
fichier..gitmodules
changements :git add .gitmodules
.git/config
.git rm --cached path_to_submodule
(sans barre oblique)..git
répertoire :rm -rf .git/modules/path_to_submodule
git commit -m "Removed submodule <name>"
rm -rf path_to_submodule
Voir aussi : étapes alternatives ci-dessous .
"Et au fait, y a-t-il une raison pour laquelle je ne peux pas simplement git submodule rm whatever ?" ?
@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.
Franchement, je ne sais pas pourquoi. J'espère qu'ils ajouteront une commande, cependant. Ces 4 étapes sont trop compliquées.
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).
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
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'ensemblesubmodule.<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.git rm --cached path_to_submodule
(sans barre oblique)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} "$@"
@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.
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.
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
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.
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) :
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.
Des étapes simples
git config -f .git/config --remove-section submodule.$submodulename
git config -f .gitmodules --remove-section submodule.$submodulename
git rm --cached $submodulepath
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 ? .
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
.
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
Pour obtenir la liste des modules où aucun changement local n'a été effectué - git submodule | grep '^+' | cut -d' ' -f2
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.
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.
J'ai utilisé l'option --name pour que le remplacement fonctionne... voir stackoverflow.com/questions/14404704/
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.
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
yrm -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/15621380 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
21 votes
S'il vous plaît, économisez votre temps et allez directement à la réponse qui fonctionne (en 2017) : stackoverflow.com/a/36593218/528313
0 votes
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 . En fait, Xcode, et peut-être d'autres applications, ont du mal à développer les url contenant '~'. Une fois que j'ai changé ssh://username@server.remoteHost.com/~/git/MyRepo.git en ssh://username@server.remoteHost.com/home/username/git/MyRepo.git (regardez le chemin réel sur votre serveur), toutes les bizarreries ont disparu en dix minutes. Voir aussi stackoverflow.com/questions/32833100/