web-dev-qa-db-fra.com

Renommer un sous-module git

Existe-t-il un moyen simple de renommer un répertoire de sous-modules git (en dehors du mouvement complet de suppression et de l'ajout d'un nouveau nom de destination).

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

133
Lars Tackmann

J'ai trouvé que le flux de travail 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.

90
Mariusz Nowak

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 A a été appris à déplacer son arbre de travail et à ajuster les chemins dans le fichier .gitmodules.


Voir plus dans commit 0656781fadca1 :

L'utilisation actuelle de "git mv" Sur un sous-module déplace l'arbre de travail du sous-module dans celui du superprojet. Mais le paramètre de chemin du sous-module dans .gitmodules Reste inchangé, ce qui est maintenant incompatible avec l'arbre de travail et crée des commandes git qui s'appuient sur le bon path -> name mapping (Comme status et diff) se comportent étrangement.

Laissons "git mv" Aider ici en déplaçant non seulement l'arbre de travail du sous-module, mais également en mettant à jour le paramètre "submodule.<submodule name>.path" À partir du fichier .gitmodules Et en organisant les deux.
Cela ne se produit pas si aucun fichier .gitmodules N'est trouvé et n'émet un avertissement que s'il n'a pas de section pour ce sous-module. Ceci est dû au fait que l'utilisateur peut simplement utiliser des liens simples sans le fichier .gitmodules Ou s'il a déjà mis à jour manuellement le paramètre de chemin avant d'émettre la commande "git mv" (auquel cas l'avertissement lui rappelle que mv l'aurait fait pour lui).
Seulement lorsque .gitmodules Est trouvé et contient des conflits de fusion, la commande mv échouera et demandera à l'utilisateur de résoudre le conflit avant de réessayer.


git 2.9 (juin 2016) améliorera git mv pour le sous-module:

Voir commit a127331 (19 avril 2016) par Stefan Beller (stefanbeller) .
(Fusion par Junio ​​C Hamano - gitster - dans commit 9cb50a , 29 avril 2016)

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

"git mv old new" N'a pas ajusté le chemin d'accès pour un sous-module qui vit comme un sous-répertoire dans le répertoire old/ Correctement.

les sous-modules doivent toutefois mettre à jour leur lien vers le répertoire git, ainsi que les mises à jour du fichier .gitmodules.

194
VonC
$ mv submodule-oldpath submodule-newpath
$ git rm submodule-oldpath
$ git add submodule-newpath
$ git submodule sync

Cette solution ne fonctionne pas pour moi car lors de l’utilisation de la commande git add, le sous-module a été inclus dans le projet en tant que répertoire simple et non en tant que sous-module.

la solution correcte est:

$ mv submodule-oldpath ~/another-location
$ git rm submodule-oldpath
$ git submodule add submodule-repository-URL submodule-newpath

Source: http://bcachet.github.io/development/2012/05/25/rename-git-submodule/

9
Mahmoud Adam

Je viens d'essayer 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ésinitialiser 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!

9
jaredwolff

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 enlevé:

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

vous pouvez également vérifier et supprimer les références à:

  • .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 contient le fichier config où il conserve la référence à son worktree

puis organisez vos modifications en validant toutes les modifications apportées à votre repo 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 le sous-module git à nouveau:

git submodule add --name <custom_name> [email protected]:foo/bar.git <my/path>
4
kenorb

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

Je pense que vous pourriez avoir besoin de faire un git submodule sync après, mais je ne suis pas en mesure de vérifier pour le moment.

3
Abizern

MacOs : Quand je veux utiliser solution VonC pour changer le dossier du sous-module Common en minuscule:

git mv Common common

Je reçois

fatal: renommer 'Common' a échoué: argument invalide

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

git mv Common commontemp
git mv commontemp common

C'est tout :)

2
Kamil Kiełczewski