Comment puis-je transférer un Git sous-module dans un dépôt Git?
Je voudrais changer le nom du répertoire d'un Git sous-module dans mon Git superproject.
Laisse supposer 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 supprimer d'abord (expliqué
ici et ici) et puis re-ajouter.
Ne Git vraiment besoin de tout le chemin dans le sous-module tag
[submodule ".emacs.d/vimpulse"]
ou est-il également possible de stocker simplement le nom de la sous-projet?
[submodule "vimpulse"]
- REMARQUE: l'OP réponses à ses propres questions avec les
git mv
de commande, à droite dans la question. - CEPENDANT, vous ne pouvez pas utiliser
git mv
comme ça. Utilisationdeinit
puisrm
comme indiqué stackoverflow.com/a/18892438/8047. - au moins sur git 2.0.0,
git mv
fonctionne, tout simplement pour submodules aussi, besoin de rien d'autre. - Début avec Git
1.8.5
déplacement submodules est pris en charge en mode natif à l'aide de lagit mv
de commande (dans les notes de version, d'abord lié par @thisch lui-même). Aussi réponse ici
Vous devez vous connecter pour publier un commentaire.
Remarque: Comme mentionné dans les commentaires de cette réponse fait référence à des étapes nécessaires avec les anciennes versions de git. Git maintenant a un support natif pour le déplacement des submodules:
Il est similaire à la façon dont vous supprimer un sous-module (voir Comment puis-je supprimer un sous-module?):
.gitmodules
et modifier le chemin d'accès de la sous-module de façon appropriée, et de le mettre 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 l'ensemble de son contenu à.git/modules/new/parent/submodule
..git/modules/new/parent/config
fichier, assurez-vous que worktree élément de points pour les nouveaux endroits, de sorte que dans cet exemple, il devrait êtreworktree = ../../../../../new/parent/module
. Généralement, il devrait y avoir plus de deux..
puis répertoires dans le chemin direct dans cet endroit.Modifier le fichier
new/parent/module/.git
, assurez-vous que le chemin d'accès dans il pointe vers le bon nouvel emplacement à l'intérieur du projet.git
dossier, donc dans cet exemplegitdir: ../../../.git/modules/new/parent/submodule
.git status
de sortie ressemble à ceci pour moi par la suite:Enfin, valider les modifications.
path
configuration et le sous-module du nom. Par exemple, en déplaçant les foo/module de bar/module, vous devez modifier dans .gitmodules la section[submodule "foo/module"]
à[submodule "bar/module"]
, et en vertu de ce même articlepath = foo/module
àpath = bar/module
. Aussi, vous devez le modifier dans .git/config la section[submodule "foo/module"]
à[submodule "bar/module"]
.renamed: plugins/foo -> plugins/asd/bar
pour les autres, il n'est pas "comprendre" qu'ils sont déplacés:new file: plugins/another_dir/new
etdeleted: plugins/old
(au lieu derenamed: plugins/old -> plugins/another_dir/new
. J'ai beaucoup de submodules, chaque changé sur.gitmodules
. Donc, je ne comprends pas pourquoi il agit de façon aléatoire :Sfatal: 'git status --porcelain' failed in...
il suffit de supprimer toute .git fichiers ou des répertoires dans le sous-module.git add new/parent
n'ai rien fait pour moi depuis que git ne pas suivre les répertoires. Je doit "git add new/parent/sous-module" à la place.git add new/parent
n'ai rien fait aprèsmkdir
, qui fait sens, parce que Git ne pouvez pas suivre les répertoires vides. J'ai dûgit add new/parent
après déplacer le sous-module répertoire avecmv
..git/modules/MODULENAME/config
doit être mis à jour pour pointer vers le nouveau chemin d'accès..git/modules/old/parent/submodule
, de le déplacer vers le nouvel emplacement, la mise à jourgitdir
dansold/parent/submodule/.git
...fatal: Not a git repository: ../.git/modules/foobar
, b/c je pense qu'il manque les étapes de cette réponse. En fait, je ne pense pas qu'il est sage de muck autour de Git plomberie sans les bons outils. C'est pourquoi je pense que la meilleure réponse est celui qui utilise Git outils de suppression et de cloner le nouveau sous-module.git mv old/submod new/submod
fonctionne comme prévu et la plomberie pour vous. Vous voudrez probablement utiliser git 1.9.3+ parce qu'elle comprend des correctifs pour les sous-module de déplacement.parent/submodule/.git
car il fait référence à l'ancien nom, et de supprimer.git/modules/parent/old
. Peut-être parce que je suis aussi le renommer à l'aide degit mv parent/old parent/new
.old/submod
a été source de confusion. Vous pouvez utiliser lemv
de la syntaxe. Dans l'exemple de l'/
indique que l'ancien emplacement de lasubmod
était dans le dossierold
. L' / a donc le sens ordinaire de séparateur de répertoireLes plus modernes de réponse, prises de Valloric du commentaire ci-dessus:
git mv old/submod new/submod
git status
.)git commit
et vous êtes bon pour aller!Fait!
1.9.3
sauf pour un sous-module à l'intérieur de l'déplacé sous-module. Qui avait besoin d'un nettoyage manuel.1.8.5
comme décrit dans la les notes de version.git mv old/submod new/submod
pourrait certainement être mieux expliqué pour les masses bien.git mv
technique et il a très bien fonctionné..gitmodules
fichier, laold/submod
est encore utilisé comme étiquette pour le sous-module alors que le chemin a été changé. Pour obtenir le label changé, il semble que vous besoin de déplacer les modules chemin d'accès au répertoire à l'intérieur de.git
, puis modifiez manuellement le label.gitmodules
.Dans mon cas, j'ai voulu déplacer un sous-module d'un répertoire dans un sous-répertoire, par exemple "AFNetworking" -> "ext/AFNetworking". Ce sont les étapes que j'ai suivi:
[core] worktree
ligne. Le mien a changé à partir de../../../AFNetworking
à../../../../ext/AFNetworking
gitdir
. Le mien a changé à partir 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 git status:
Et le tour est joué. L'exemple ci-dessus ne permet pas de modifier le répertoire de profondeur, ce qui fait une grande différence à la complexité de la tâche, et de ne pas changer le nom de la sous-module (qui peut ne pas être vraiment nécessaire, mais je l'ai fait pour être cohérent avec ce qui se passerait si j'ai ajouté un nouveau module dans cette voie.)
[Mise à jour: 2014-11-26] Comme Yar résume succinctement ci-dessous, avant de faire quoi que ce soit, assurez-vous de connaître l'URL de la sous-module. Si inconnu, ouvrez
.git/.gitmodules
et examiner les principauxsous-module.<nom>.url
.Ce qui a fonctionné pour moi a été de retirez l'ancienne sous-module à l'aide de
git submodule deinit <submodule>
suivie pargit rm <submodule-folder>
. Puis ajouter le sous-module de nouveau avec le nouveau nom de dossier et de s'engager. La vérification de git status avant de s'engager, le vieux sous-module renommé le nouveau nom et .gitmodule modifié.Le truc semble être la compréhension que le
.git
répertoire pour les submodules, se trouvent maintenant dans le référentiel maître, en vertu de.git/modules
, et chaque sous-module a un.git
fichier qui pointe vers elle. C'est la procédure que vous avez besoin maintenant:.git
fichier dans le sous-module du répertoire de travail, et de modifier le chemin d'accès qu'il contient, de sorte qu'il pointe vers le bon répertoire dans le référentiel maître de.git/modules
répertoire..git/modules
répertoire, et de trouver le répertoire correspondant à votre sous-module.config
fichier, mise à jour de laworktree
chemin de sorte qu'il pointe vers le nouvel emplacement de la sous-module du répertoire de travail..gitmodules
fichier dans la racine du référentiel maître, mise à jour le chemin d'accès au répertoire de travail de la sous-module.git add -u
git add <parent-of-new-submodule-directory>
(Il est important que vous ajoutez le parent, et de ne pas le sous-module répertoire lui-même).Quelques remarques:
[submodule "submodule-name"]
lignes dans.gitmodules
et.git/config
doit correspondre à l'autre, mais ne correspondent pas à quoi que ce soit d'autre..git
répertoire doit pointer correctement les uns aux autres..gitmodules
et.git/config
fichiers doivent être synchronisés.Vous pouvez simplement ajouter un nouveau sous-module et de supprimer l'ancien sous-module en utilisant les commandes standard. (qui permettra d'éviter des erreurs accidentelles à l'intérieur de .git)
Exemple de configuration:
Exemple déplacer 'jquery' à 'vendor/jquery/jquery' :
Bonus de méthode pour les grandes submodules:
Si le sous-module est grande et que vous préférez ne pas attendre pour le clone, vous pouvez créer le sous-module à l'aide de l'ancien que l'origine, et puis passer l'origine.
Exemple (utiliser le même exemple de configuration)
newPath
.La chaîne entre guillemets après "[sous-module" n'a pas d'importance. Vous pouvez la changer en "foobar" si vous le souhaitez. Il est utilisé pour trouver l'entrée correspondante dans ".git/config".
Par conséquent, si vous faites le changement avant d'exécuter "git sous-module init", ça marchera très bien. Si vous faites le changement (ou de prendre le changement par le biais d'une fusion), vous devez modifier manuellement .git/config ou exécuter "git sous-module init" à nouveau. Dans le second cas, vous serez à gauche avec un inoffensif "brin" d'entrée avec l'ancien nom .git/config.
git submodule sync
propage la modification de.git/config
automatiquementLa solution donnée ne fonctionne pas pour moi, mais une version similaire a...
C'est avec un clone de référentiel, d'où le sous-module git repos sont contenues dans le top des dépôts .git dir. Tous les cations sont à partir du haut de référentiel:
Modifier .gitmodules et changer le "path =" paramètre du sous-module en question. (Pas besoin de changer de label, ni d'ajouter ce fichier à l'index.)
Modifier .git/modules/nom/config et modifier la "worktree =" paramètre du sous-module en question
exécuter:
Je me demande si cela fait une différence si les référentiels sont atomiques, ou par rapport submodules, dans mon cas, c'était relative (sous-module/.git est une référence de retour à topproject/.git/modules/sous-module)
Suffit d'utiliser le script shell git-sous-module-déplacer.
Je suis juste allé à travers cette épreuve hier et cette réponse a parfaitement fonctionné. Voici mes étapes, pour plus de clarté:
more .gitmodules
car une fois que vous supprimez le sous-module, il ne va pas être autour dedeinit
,rm
et puissubmodule add
EXEMPLE
COMMANDES
REMARQUE: git mv ne fait pas cela. À tous.
git mv
devraient être mieux dans les toutes dernières versions de Git bien.mv
. Merci!