Comment remplacer un sous-module git par un autre dépôt?

96

Comment remplacer un sous-module git par un dépôt git différent?

Plus précisément, j'ai un sous-module:

  • situé à ./ExternalFrameworks/TestFrameworkce point vers un repo git[email protected]:userA/TestFramework.git
  • Je voudrais qu'il pointe maintenant [email protected]:userB/TestFramework.git.

Le problème est que lorsque je supprime le sous-module avec la méthode décrite ici , puis le rajoute à l'aide de la commande

git submodule add [email protected]:userB/TestFramework.git

J'obtiens cette erreur:

A git directory for 'ExternalFrameworks/TestFramework' is found locally with remote(s):
  origin    [email protected]:userA/TestFramework.git
If you want to reuse this local git directory instead of cloning again from
  [email protected]:userB/TestFramework.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.
joseph.hainline
la source
1
duplication possible de Changer le référentiel distant pour un sous
jiyinyiyong

Réponses:

123

Si l'emplacement (URL) du sous-module a changé, vous pouvez simplement:

  1. Modifiez votre .gitmodulefichier pour utiliser la nouvelle URL
  2. Supprimer le dossier du sous-module dans le référentiel rm -rf .git/modules/<submodule>
  3. Supprimer le dossier du sous-module dans le répertoire de travail rm -rf <submodule>
  4. Courir git submodule sync
  5. Courir git submodule update

Des informations plus complètes peuvent être trouvées ailleurs:

Tim Henigan
la source
4
A noter également: lorsqu'un autre utilisateur (qui avait déjà introduit le sous-module) reçoit votre mise à jour, il devra également faire la "synchronisation du sous-module git" une fois avant que le nouveau sous-module ne fonctionne pour lui.
joseph.hainline
2
Cela n'a pas fonctionné pour moi. Mon sous-module indiquait toujours l'ancienne URL après cela. Des idées pourquoi?
Arne
34
@Arne Peut-être que votre sous-module n'a jamais été correctement initialisé. Je devais le faire rm -rf .git/modules/<submodule>avant que ça marche pour moi.
David Braun
@DavidBraun J'ai le même problème que @Arne bien que faire git submodule syncaprès rm -rf .git/modules/<submodule>donne fatal: Not a git repository: ../.git/modules/<submodule>. Des conseils? J'ai initialement créé le sous-module via git submodule add https://<submodule-url>selon les documents git ...
acannon828
1
Ensuite, j'ai dû cd dans le répertoire du module, git checkout la branche que je veux, puis git pull.
Nicolas Raoul
34

Tout d'abord, supprimez le sous-module actuel avec la méthode déjà mentionnée ici , que j'inclus par commodité:

  • Supprimer la section pertinente du .gitmodulesfichier
  • Supprimer la section correspondante de .git/config
  • Exécuter git rm --cached path_to_submodule(pas de barre oblique finale)
  • Validez et supprimez les fichiers de sous-modules maintenant non suivis

Maintenant, ajoutez le nouveau sous-module avec l' --nameindicateur. Cela donnera à git un nom alternatif à référencer .git/configpour le sous-module, à déconfliger avec le sous-module qui était là historiquement, que vous souhaitez toujours travailler dans votre histoire précédente.

Alors tapez:

git submodule add --name UpdatedTestFramework [email protected]:userB/TestFramework.git

et vous obtiendrez le sous-module chargé sur le chemin que vous attendez.

joseph.hainline
la source
2
Bien que cette méthode fonctionne, ce n'est pas aussi propre que la méthode de Tim.
joseph.hainline
4
Cela a fonctionné pour moi, mais j'ai également dû supprimer .git/modules/<path_to_submodule>.
Nate
1
Appréciez la référence à --name. Je n'étais pas au courant des problèmes liés à cela, et je n'ai pas pu remplacer un sous-module avant d'avoir utilisé cette option (grâce à votre réponse).
aknuds1
Cela a fini par être la seule méthode qui a fonctionné pour moi, mais je voulais garder le même nom de répertoire. Il a vérifié le chemin correct et a fait du nom du module le nom souhaité, mais le nom du répertoire de travail était le nouveau nom du dépôt. Donc, si vous voulez le même nom, vous devez également le spécifier à la fin de l'url comme ceci: git submodule add --name old-name-to-keep [email protected]:userB/new-repository.git old-name-to-keep
rgb
8

Ces commandes effectueront le travail à l'invite de commande sans modifier aucun fichier sur le référentiel local.

git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git
git config --file=.gitmodules submodule.Submod.branch Dev
git submodule sync
git submodule update --init --recursive --remote
Pavan Sokke Nagaraj
la source
5

Ce qui a résolu cela pour moi était à la racine de votre dépôt git (pas le sous-module), exécutez

rm -rf .git/modules/yourmodule

Ensuite, vous devriez pouvoir ajouter comme d'habitude.

Hobberwickey
la source
3

Le moyen le plus simple que j'ai trouvé est le suivant:

git rm -rf [submodule_dir]
git submodule add --name new_[submodule_name] [new_submodule_url] [submodule_dir]

Je n'ai pas aimé l'idée de modifier mon .gitmodulesmanuellement. J'ai également écrit un petit article à ce sujet.

DerZyklop
la source
2

Si vous souhaitez modifier l'URL distante uniquement pour ce clone :

git config submodule."$submodule_name".url "$new_url"

Cela n'affectera pas le .gitmodulesfichier du projet parent, il ne sera donc pas propagé à d'autres développeurs.

Ceci est décrit comme « utilisateur change d'enregistrement spécifique » ici .

Ne pas exécutergit submodule synccar cela réinitialisera à nouveau l'URL par défaut.

joeytwiddle
la source