Renommer un sous-module git

156

Existe-t-il un moyen simple de renommer un répertoire de sous-modules git (autre que de parcourir tout le mouvement de suppression et de le rajouter avec un nouveau nom de destination).

Et pendant que nous y sommes, pourquoi je ne peux tout simplement pas faire ce qui suit dans le répertoire parent: git mv old-submodule-name new-submodule-name

Lars Tackmann
la source
6
Vous n'aurez plus besoin de mettre à jour .gitmodulesmanuellement lors du déplacement d'un sous-module. voir ma réponse ci
VonC
La réponse de @ VonC a fonctionné comme un charme pour moi
laconbass
Les modules Git sont trop compliqués. npmmontre comment la simplicité fonctionne. Un jour ... peut-être ... quelqu'un ... le réécrira ... en attendant ...
Rolf
La réponse de @ VonC n'est pas l'histoire complète à partir d'aujourd'hui: cela changera en effet .gitmodules, mais renommera simplement le chemin, pas le nom du module. Vous avez besoin d'une modification supplémentaire de .gitmodules pour corriger cela et d'une 'git submodule sync' pour terminer le processus complet
zertyz
@zertyz: La propriété [submodule "name_of_submodule"] est un nom interne Git, vous pouvez le renommer pour ne pas vous confondre mais ce n'est qu'une étiquette.
MKesper

Réponses:

101

J'ai trouvé que le workflow suivant fonctionnait:

  • Mettre à jour .gitmodules
  • mv oldpath newpath
  • git rm oldpath
  • git add newpath
  • git submodule sync

Remarque: cette approche ne met pas à jour correctement l'index et les .gitmodules dans les versions 2018 de GIT.

Remarque: Vous pourrez peut-être le faire git mv oldpath newpathmaintenant, comme indiqué dans la réponse de VonC . (Assurez-vous que vous utilisez la dernière version de git)

Mariusz Nowak
la source
22
note à moi-même: pour git add newpathne pas utiliser de barre oblique
finale
10
Avec un tel flux de travail, vous créerez uniquement un lien symbolique vers le sous-répertoire que vous utilisez comme sous-module. Symlink n'est qu'une partie de la fonctionnalité globale du sous-module. Cela signifie que lorsque vous clonez le référentiel qui utilise les sous-modules renommés, vous pouvez finir avec l'erreur suivante: Aucun mappage de sous-module trouvé dans .gitmodules pour le chemin `` your-oldpath '' Après avoir supprimé l'ancien chemin (* git rm oldpath ), vous devez use git submodule add REPO-URL newpath au lieu de "git add newpath *. Une fois terminé, git status affichera quelque chose comme ceci: renommé: oldpath -> newpath
Bertrand
5
Cette solution ne fonctionne pas pour moi car lors de l'utilisation de la commande git add, le sous-module était inclus dans le projet comme un simple répertoire et non comme un sous-module. essayez $ mv submodule-oldpath ~ / another-location $ git rm submodule-oldpath $ git submodule add
Mahmoud Adam
3
Si vous rencontrez un problème avec l'arborescence de travail, vous pouvez également modifier le .git/modules/SUBMODULE/configfichier, de sorte qu'il worktreepointe à nouveau vers le bon répertoire.
Vincent Ketelaars
3
Cela n'a pas fonctionné pour moi avec git 2.13.1. Mais simplement faire git mv old newfonctionne comme un charme. Je n'ai besoin que de faire git commit pour terminer les changements.
utilisateur
226

Git1.8.5 (octobre 2013) devrait simplifier le processus . Faites simplement un:

git mv A B

" git mv A B", lors du déplacement d'un sous-module, il Aa été appris à déplacer son arborescence de travail et à ajuster les chemins dans le .gitmodulesfichier .


Voir plus dans commit 0656781fadca1 :

L'utilisation actuelle de " git mv" sur un sous-module déplace l'arborescence de travail du sous-module dans celle du superprojet. Mais le chemin du sous-module .gitmodulesn'est pas modifié, ce qui est maintenant incompatible avec l'arbre de travail et crée des commandes git qui reposent sur le bon path -> name mapping(comme statusetdiff ) se comportent étrangement.

Laissez " git mv" vous aider ici non seulement en déplaçant l'arborescence de travail du sous-module, mais aussi en mettant à jour le submodule.<submodule name>.pathparamètre " " du .gitmodulesfichier et en mettant en scène les deux.
Cela ne se produit pas lorsqu'aucun .gitmodulesfichier n'est trouvé et émet un avertissement uniquement lorsqu'il n'a pas de section pour ce sous-module. C'est parce que l'utilisateur peut simplement utiliser des gitlinks simples sans le .gitmodulesfichier ou a déjà mis à jour le paramètre de chemin à la main avant d'émettre la commande "git mv" (auquel cas l'avertissement lui rappelle que mvcela aurait fait cela pour lui).
Ce n'est que lorsqu'elle .gitmodulesest trouvée et contient des conflits de fusion que la mvcommande échoue et indique à l'utilisateur de résoudre le conflit avant de recommencer.


git 2.9 (juin 2016) va s'améliorer git mv pour le sous-module:

Voir commit a127331 (19 avril 2016) par Stefan Beller ( stefanbeller) .
(Fusionné par Junio ​​C Hamano - gitster- in commit 9cb50a3 , 29 avril 2016)

mv: autorise le déplacement de sous-modules imbriqués

" git mv old new" n'a pas ajusté le chemin pour un sous-module qui vit comme un sous-répertoire à l'intérieurold/ correctement répertoire.

Les sous-modules doivent cependant mettre à jour leur lien vers le répertoire git ainsi que les mises à jour du .gitmodulesfichier.

VonC
la source
Note à moi-même: essayez ceci sur 1.8.4 et vous l'aurez fatal: source directory is empty, source=my_source, destination=my_destination. Je vais réessayer lorsque la version 1.8.5 aura une version stable.
somme de contrôle du
@checksum Mais la version 1.8.5 a une version stable, pendant au moins quelques ... heures;) github.com/git/git/releases/tag/v1.8.5
VonC
J'ai dû construire Git version 1.8.5.GIT à partir du code source car il y a Git v.1.7.5 dans les référentiels Ubuntu. Comment construire Git à partir du code source
Maksim Dmitriev
2
@MaksimDmitriev mais qu'en est-il d'un ppa (Personal Package Archive) que j'ai mentionné dans stackoverflow.com/a/20918469/6309 ?
VonC
2
git mv ne fonctionne tout simplement pas dans ce but sur ma machine.
Alexander Dyagilev
11

J'ai juste essayé quelques-unes des suggestions ci-dessus. Je suis entrain de courir:

$ git --version
git version 1.8.4

J'ai trouvé qu'il était préférable de désamorcer le sous-module, de supprimer le répertoire et de créer un nouveau sous-module.

git submodule deinit <submodule name>

git rm <submodule folder name>

git submodule add <address to remote git repo> <new folder name>

Au moins, c'est ce qui a fonctionné le mieux pour moi. YMMV!

Jaredwolff
la source
7

Il n'est pas possible de le renommer, vous devez donc d'abord le supprimer (deinit ) et l'ajouter à nouveau.

Donc, après l'avoir retiré:

git submodule deinit <path>
git rm --cached <path>

vous pouvez également vérifier et supprimer les références à celui-ci dans:

  • .gitmodules
  • .git/config
  • supprimer le dossier de référence de .git/modules/<name>(il est préférable de faire une sauvegarde), car chaque dossier a un configfichier dans lequel il conserve la référence à sonworktree

puis organisez vos modifications en validant les modifications apportées à votre dépôt en:

git commit -am 'Removing submodule.'

et vérifiez si vous n'avez aucun problème en suspens en:

git submodule update
git submodule sync
git submodule status

alors maintenant vous pouvez ajouter à nouveau le sous-module git:

git submodule add --name <custom_name> [email protected]:foo/bar.git <my/path>
Kenorb
la source
c'est aussi aujourd'hui
Alexey
Le titre des questions est un
abus de langage
3

Modifiez le fichier .gitmodules pour renommer le sous-module, puis renommez le répertoire du sous-module.

Je pense que vous devrez peut-être faire un git submodule syncaprès, mais je ne suis pas en mesure de vérifier pour le moment.

Abizern
la source
Cela provoque le nouveau nom de sous-module pour se produire comme une nouvelle validation et non comme un changement de nom. Mais peut-être que c'est ainsi que cela doit être?
Lars Tackmann
1
@Lars: assurez-vous de supprimer également l'ancien répertoire de sous-modules!
Cascabel le
3

MacOs : lorsque je veux utiliser la solution VonC pour changer le dossier du sous-module Commonen minuscules:

git mv Common common

Je reçois

fatal: échec du changement de nom de 'Common': argument non valide

Solution - utilisez un nom de dossier temporaire et déplacez-le deux fois:

git mv Common commontemp
git mv commontemp common

C'est tout :)

Kamil Kiełczewski
la source