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
?
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 sectionsubmodule.<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} "$@"
Via la page tutoriel de sous-module Git :
pour supprimer un sous-module, vous devez:
- supprimer la section pertinente du fichier
.gitmodules
.
"1519190920 de la" Scène - supprimer la section pertinente de
.git/config
. - Exécuter
git rm --cached path_to_submodule
(pas de slash.) - Exécuter
rm -rf .git/modules/path_to_submodule
- Commit
git commit -m "Removed submodule <name>"
- supprimer les fichiers submodules Non tracés
rm -rf path_to_submodule
.gitmodules
modifications git add .gitmodules
Voir aussi : autres étapes au-dessous de .
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
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
étapes Simples
- supprimer les entrées de configuration:
git config -f .git/config --remove-section submodule.$submodulename
git config -f .gitmodules --remove-section submodule.$submodulename
- Supprimer répertoire de l'index:
git rm --cached $submodulepath
- Commit
- 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? .
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)
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.
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
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
pour résumer, voici ce que vous devez faire:
-
Set
path_to_submodule
var (no trailing slash):path_to_submodule=path/to/submodule
-
supprimer la ligne correspondante du .gitmodules fichier:
git config -f .gitmodules --remove-section submodule.$path_to_submodule
-
supprimer la section pertinente .git / config
git config -f .git/config --remove-section submodule.$path_to_submodule
-
Unstage et supprimer $path_to_submodule seulement à partir de l'index (pour éviter de perdre de l'information)
git rm --cached $path_to_submodule
-
Suivi des modifications apportées .gitmodules
git add .gitmodules
-
Commettre le superproject
git commit -m "Remove submodule submodule_name"
-
Supprimer les fichiers submodules Non tracés
rm -rf $path_to_submodule
rm -rf .git/modules/$path_to_submodule
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
.
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)
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}"
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.
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"
.
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
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.
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é
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.
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.