Je voudrais changer le nom de répertoire d'un sous-module Git dans mon superprojet Git.
Supposons que j'ai l'entrée suivante dans mon .gitmodules
fichier:
[submodule ".emacs.d/vimpulse"]
path = .emacs.d/vimpulse
url = git://gitorious.org/vimpulse/vimpulse.git
Que dois-je taper pour déplacer le .emacs.d/vimpulse
répertoire .emacs.d/vendor/vimpulse
sans le supprimer d'abord (expliqué
ici et ici ), puis l'ajouter à nouveau.
Est-ce que Git a vraiment besoin de tout le chemin dans la balise de sous-module
[submodule ".emacs.d/vimpulse"]
ou est-il également possible de stocker uniquement le nom du sous-projet?
[submodule "vimpulse"]
git
git-submodules
chahut
la source
la source
git mv
commande, directement dans la question.git mv
comme ça. Utilisezdeinit
ensuiterm
comme stackoverflow.com/a/18892438/8047 spécifié .git mv
fonctionne aussi pour les sous-modules, pas besoin d'autre chose.1.8.5
déplacer des sous-modules est pris en charge de manière native à l'aide de lagit mv
commande (à partir des notes de version , d'abord liées par @thisch lui-même). Également répondu icigit mv
déplace le sous-module dans l'espace de travail et met correctement à jour les fichiers .git du sous-module, mais le sous-dossier du dossier .git / modules du référentiel parent reste le même - est-ce correct? (J'utilise git 2.19.0 sous Windows)Réponses:
Remarque: Comme mentionné dans les commentaires, cette réponse fait référence aux étapes nécessaires avec les anciennes versions de git. Git a maintenant un support natif pour déplacer des sous-modules:
Le processus est similaire à la façon dont vous supprimeriez un sous-module (voir Comment supprimer un sous-module? ):
.gitmodules
et modifiez le chemin du sous-module de manière appropriée et placez-le dans l'index avecgit add .gitmodules
.mkdir -p new/parent
).mv -vi old/parent/submodule new/parent/submodule
).git add new/parent
).git rm --cached old/parent/submodule
..git/modules/old/parent/submodule
avec tout son contenu vers.git/modules/new/parent/submodule
..git/modules/new/parent/config
fichier, assurez-vous que l'élément de l'arbre de travail pointe vers les nouveaux emplacements, donc dans cet exemple, il devrait l'êtreworktree = ../../../../../new/parent/module
. En général, il doit y avoir deux..
répertoires de plus dans le chemin direct à cet endroit.Modifiez le fichier
new/parent/module/.git
, assurez-vous que le chemin d'accès pointe vers le nouvel emplacement correct dans le.git
dossier principal du projet , donc dans cet exemplegitdir: ../../../.git/modules/new/parent/submodule
.git status
la sortie ressemble à ceci pour moi après:Enfin, validez les modifications.
la source
path
configuration et le nom du sous-module. Par exemple, en déplaçant foo / module vers bar / module, vous devez changer dans .gitmodules la section[submodule "foo/module"]
en[submodule "bar/module"]
, et sous cette même sectionpath = foo/module
enpath = bar/module
. Vous devez également modifier dans .git / config la section[submodule "foo/module"]
en[submodule "bar/module"]
.fatal: 'git status --porcelain' failed in...
simplement supprimer tous les fichiers ou répertoires .git dans le sous-module..git/modules/old/parent/submodule
, le déplacement vers le nouvel emplacement, la misegitdir
à jour dansold/parent/submodule/.git
...git mv old/submod new/submod
fonctionne comme prévu et fait toute la plomberie pour vous. Vous voudrez probablement utiliser git 1.9.3+ car il inclut des correctifs pour le déplacement des sous-modules.La réponse la plus moderne, tirée du commentaire de Valloric ci-dessus:
git mv old/submod new/submod
git status
.)git commit
et vous êtes prêt à partir!Terminé!
la source
1.9.3
sauf pour un sous-module à l'intérieur du sous-module déplacé. Cela nécessitait un nettoyage manuel.1.8.5
comme décrit dans les notes de version ..gitmodules
fichier, leold/submod
est toujours utilisé comme étiquette pour le sous-module alors que le chemin a été modifié. Pour que l'étiquette change également, il semble que vous devez réellement déplacer le chemin du répertoire des modules à l'intérieur.git
, puis changer manuellement l'étiquette.gitmodules
.Dans mon cas, je voulais déplacer un sous-module d'un répertoire dans un sous-répertoire, par exemple "AFNetworking" -> "ext / AFNetworking". Voici les étapes que j'ai suivies:
[core] worktree
ligne. Le mien est passé de../../../AFNetworking
à../../../../ext/AFNetworking
gitdir
. Le mien est passé de../.git/modules/AFNetworking
à../../git/modules/ext/AFNetworking
git add .gitmodules
git rm --cached AFNetworking
git submodule add -f <url> ext/AFNetworking
Enfin, j'ai vu dans le statut git:
Et voilà. L'exemple ci-dessus ne change pas la profondeur du répertoire, ce qui fait une grande différence dans la complexité de la tâche, et ne change pas le nom du sous-module (ce qui n'est peut-être pas vraiment nécessaire, mais je l'ai fait pour être cohérent avec ce se produirait si j'ajoutais un nouveau module sur ce chemin.)
la source
[Mise à jour: 2014-11-26] Comme Yar le résume bien ci-dessous, avant de faire quoi que ce soit, assurez-vous de connaître l'URL du sous-module. Si inconnue, ouvrez
.git/.gitmodules
et examinez la clésubmodule.<name>.url
.Ce qui a fonctionné pour moi a été de supprimer l'ancien sous-module en utilisant
git submodule deinit <submodule>
suivi degit rm <submodule-folder>
. Ajoutez ensuite le sous-module avec le nouveau nom de dossier et validez. La vérification de l'état de git avant de valider affiche l'ancien sous-module renommé avec le nouveau nom et le .gitmodule modifié.la source
L'astuce semble être de comprendre que le
.git
répertoire des sous-modules est maintenant conservé dans le référentiel maître, sous.git/modules
, et chaque sous-module a un.git
fichier qui le pointe. Voici la procédure dont vous avez besoin maintenant:.git
fichier dans le répertoire de travail du sous-module et modifiez le chemin qu'il contient afin qu'il pointe vers le bon répertoire dans le répertoire du référentiel maître.git/modules
..git/modules
et recherchez le répertoire correspondant à votre sous-module.config
fichier, en mettant à jour leworktree
chemin afin qu'il pointe vers le nouvel emplacement du répertoire de travail du sous-module..gitmodules
fichier à la racine du référentiel maître, en mettant à jour le chemin d'accès au répertoire de travail du sous-module.git add -u
git add <parent-of-new-submodule-directory>
(Il est important que vous ajoutiez le parent et non le répertoire du sous-module lui-même.)Quelques notes:
[submodule "submodule-name"]
lignes.gitmodules
et.git/config
doivent correspondre, mais ne correspondent à rien d'autre..git
répertoire doivent pointer correctement l'un vers l'autre..gitmodules
et.git/config
doivent être synchronisés.la source
La chaîne entre guillemets après "[sous-module" n'a pas d'importance. Vous pouvez le changer en "foobar" si vous le souhaitez. Il est utilisé pour trouver l'entrée correspondante dans ".git / config".
Par conséquent, si vous effectuez la modification avant d'exécuter "git submodule init", cela fonctionnera correctement. Si vous apportez la modification (ou la récupérez via une fusion), vous devrez soit éditer manuellement .git / config, soit réexécuter "git submodule init". Si vous faites ce dernier, vous vous retrouverez avec une entrée "échouée" inoffensive avec l'ancien nom dans .git / config.
la source
git submodule sync
propage.git/config
automatiquement le changementVous pouvez simplement ajouter un nouveau sous-module et supprimer l'ancien sous-module à l'aide de commandes standard. (devrait éviter toute erreur accidentelle à l'intérieur de .git)
Exemple de configuration:
Examinez le déplacement de «jquery» vers «vendor / jquery / jquery»:
Méthode bonus pour les grands sous-modules:
Si le sous-module est volumineux et que vous préférez ne pas attendre le clone, vous pouvez créer le nouveau sous-module en utilisant l'ancien comme origine, puis changer d'origine.
Exemple (utilisez le même exemple de configuration)
la source
newPath
.La solution donnée n'a pas fonctionné pour moi, mais une version similaire a fonctionné ...
C'est avec un référentiel cloné, donc les sous-modules git repos sont contenus dans les répertoires supérieurs .git dir. Tous les cations proviennent du référentiel supérieur:
Modifiez .gitmodules et modifiez le paramètre "path =" du sous-module en question. (Pas besoin de changer l'étiquette, ni d'ajouter ce fichier à l'index.)
Modifiez .git / modules / name / config et modifiez le paramètre "worktree =" pour le sous-module en question
courir:
Je me demande si cela fait une différence si les référentiels sont atomiques, ou des sous-modules relatifs, dans mon cas c'était relatif (sous-module / .git est une référence à topproject / .git / modules / submodule)
la source
Utilisez simplement le script shell git-submodule-move .
la source
Je viens de traverser cette épreuve hier et cette réponse a parfaitement fonctionné. Voici mes étapes, pour plus de clarté:
more .gitmodules
car une fois le sous-module supprimé, il ne sera plus làdeinit
,rm
puissubmodule add
EXEMPLE
COMMANDES
REMARQUE: git mv ne fait pas cela. Du tout.
la source
git mv
devrait cependant être meilleur dans les toutes dernières versions de Git.mv
. Merci!