Comment changer le référentiel distant pour un sous-module git?

724

J'ai créé un référentiel git contenant un sous-module. Je suis en mesure de dire au sous-module lui-même de changer son chemin de référentiel distant, mais je ne sais pas comment dire au référentiel parent comment changer le chemin du référentiel distant pour le sous-module.

Je ne serais pas surpris si je suis un peu malchanceux et que je dois faire les choses manuellement, car même la suppression de sous-modules n'est pas facile.

Andrew Grimm
la source
8
Remarque: Git 2.25 (Q1 2020) est livré avec une nouvelle commande ":git submodule set-url [--] <path> <newurl>
VonC

Réponses:

1010

Vous devez simplement pouvoir modifier le .gitmodulesfichier pour mettre à jour l'URL, puis exécuter git submodule syncpour refléter cette modification dans le superprojet et votre copie de travail.

Jim Puls
la source
22
Cela ne semble pas mettre à jour .git / config, au moins dans 1.7.1 ou 1.7.3.
davidtbernal
6
cela met-il également à jour la configuration de l'URL du sous-module pour les validations précédentes? ex. si je récupère un commit plus ancien, cela pointera-t-il vers de nouvelles URL de sous-module?
maxmelbin
63
Utilisez git submodule foreach -q git config remote.origin.urlpour voir les URL "réelles" du sous-module
Joel Purra
10
Il n'a pas été mis à jour .git/configpour moi en utilisant git 2.1.0. J'ai dû mettre à jour les deux .gitmoduleset .git/configmanuellement avant d'exécuter un git submodule sync --recursivepour que ma télécommande de sous-module soit mise à jour.
desseim
7
Il semble manquer l'étape clé git submodule update --init --recursive --remotequi modifie réellement le référentiel en la nouvelle télécommande
Jason Axelson
155

Ces commandes feront le travail sur 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 Development
git submodule sync
git submodule update --init --recursive --remote

Veuillez consulter le blog pour les captures d'écran: Modification de l'URL / branche des sous-modules GIT en une autre URL / branche du même référentiel

Pavan Sokke Nagaraj
la source
8
Cela a fonctionné mais je devais me rappeler de pousser les modifications sur la télécommande. git add .gitmodules git commit -m "modified submodule URL" git push origin master
skulz00
5
Eh bien, cela a créé un terrible gâchis pour moi. Les commandes ont baissé doucement, mais le référentiel du sous-module réel pense toujours que sa télécommande est l'ancienne (l'ancienne URL). Peut-être que ces commandes devraient être accompagnées d'autres commandes dans le référentiel du sous-module?
Motti Shneor
5
La dernière commande est un peu extrême ... Si vous avez des sous-modules avec des sous-modules à l'intérieur, cela mettra également à jour les sous-sous-modules, ce qui est peu probable ce dont vous avez besoin.
Baptiste Wicht
7
Notez que vous devez remplacer le sous-module par le nom de votre sous-module!
Shital Shah
133

En termes simples, il vous suffit de modifier le fichier .gitmodules, puis de resynchroniser et de mettre à jour:

Modifiez le fichier, soit via une commande git, soit directement:

git config --file=.gitmodules -e

ou juste:

vim .gitmodules

puis resynchronisez et mettez à jour:

git submodule sync
git submodule update --init --recursive --remote
Matthew Wilcoxson
la source
6
git submodule update --inittravaillé pour moi, --remotesemble le lier à la tête du repo à distance.
Chaim Eliyah
96

Avec Git 2.25 (Q1 2020), vous pouvez le modifier .
Voir "L' URL du sous-module Git a changé " et la nouvelle commande

git submodule set-url [--] <path> <newurl>

Réponse originale (mai 2009, il y a dix ans)

En fait, un correctif a été soumis en avril 2009 pour clarifier le gitmodulerôle.

Alors maintenant, la documentation de gitmodule ne comprend pas encore:

Le .gitmodulesfichier, situé dans le répertoire de niveau supérieur d'une arborescence de travail git, est un fichier texte avec une syntaxe correspondant aux exigences de linkgit: git-config 1 .
[NOUVEAU]:
Comme ce fichier est géré par Git, il suit les enregistrements + des sous-modules d'un projet.
Les informations stockées dans ce fichier sont utilisées comme indice pour amorcer la version faisant autorité de l'enregistrement stocké dans le fichier de configuration du projet.
Les modifications d'enregistrement spécifiques à l'utilisateur (par exemple pour tenir compte des différences d'URL de sous-module dues à des situations de mise en réseau) doivent être apportées au fichier de configuration, tandis que les modifications d'enregistrement à propager (par exemple + en raison d'un déplacement de la source du sous-module) doivent être apportées à ce fichier. .

Cela confirme à peu près la réponse de Jim .


Si vous suivez ce tutoriel de sous-module git , vous voyez que vous avez besoin d'un " git submodule init" pour ajouter les URL du référentiel de sous-module à .git / config.

" git submodule sync" a été ajouté en août 2008 précisément pour faciliter cette tâche lorsque l'URL change (surtout si le nombre de sous-modules est important).
Le script associé à cette commande est assez simple:

module_list "$@" |
while read mode sha1 stage path
do
    name=$(module_name "$path")
    url=$(git config -f .gitmodules --get submodule."$name".url)
    if test -e "$path"/.git
    then
    (
        unset GIT_DIR
        cd "$path"
        remote=$(get_default_remote)
        say "Synchronizing submodule url for '$name'"
        git config remote."$remote".url "$url"
    )
    fi
done

L'objectif reste: git config remote."$remote".url "$url"

VonC
la source
Je voulais changer l'URL du sous-module uniquement sur cette machine. À partir du projet parent, j'ai pu modifier l'enregistrement en .git/configfaisant: git config submodule."$submodule_name".url "$new_url" ce qui est également décrit ici .
joeytwiddle
À quoi git submodule set-url [--] <path> <newurl>servent les doubles tirets en option ?
jeverling
1
@jeverling Ils aident à séparer les options des paramètres: voir stackoverflow.com/a/1192194/6309
VonC
1
Notez que pour les utilisateurs d'Ubuntu avec une ancienne version git, vous pouvez utiliser ce PPA pour mettre à jour: launchpad.net/~git-core/+archive/ubuntu/ppa
starbeamrainbowlabs
69

Ce qui a fonctionné pour moi (sous Windows, en utilisant la version 1.8.3.msysgit.0 de git):

  • Mettez à jour .gitmodules avec le chemin d'accès au nouveau référentiel
  • Supprimez la ligne correspondante du fichier ".git / config"
  • Supprimez le répertoire correspondant dans le répertoire ".git / modules / external"
  • Supprimez le répertoire du sous-module extrait lui-même (vous ne savez pas si cela est nécessaire)
  • Courir git submodule initetgit submodule update
  • Assurez-vous que le sous-module extrait est au bon commit, et validez-le, car il est probable que le hachage sera différent

Après avoir fait tout ça, tout est dans l'état auquel je m'attendais. J'imagine que d'autres utilisateurs du référentiel éprouveront la même douleur lorsqu'ils viendront à jour - il serait sage d'expliquer ces étapes dans votre message de validation!

Ben Hymers
la source
2
Merci beaucoup pour cela. C'est le seul qui a fonctionné pour moi après avoir déjà exécuté un git submodule update. Suivre les autres réponses ne changerait pas ce qui se trouvait dans le ./git/modules/externalrépertoire, donc tenter de mettre à jour le ferait toujours tirer l'URL incorrecte.
NtscCobalt
cela semble être un peu dangereux, et je ne suis pas sûr que cela préserve l'histoire du sous-module précédent. Si, par exemple, vous voulez vérifier un ancien commit ou une branche de votre référentiel principal (celui contenant le sous-module), je ne suis pas sûr qu'il saura tirer le vieux sous-module attaché et lié à cet ancien commit du principal .
Motti Shneor
Non, il ne le saura certainement pas - vous devrez refaire toutes les étapes après la première. C'est exactement ce que j'ai trouvé efficace pour nuancer l'état actuel du sous-module. Je ne sais pas si l'état des choses a changé depuis que j'ai écrit ça, attention :)
Ben Hymers
@MottiShneor qui semble dangereux si vous avez besoin de conserver l'historique du sous-module précédent, bien que je n'en sois pas sûr. Dans mon cas, c'est la seule solution qui a fonctionné, ce que je voulais c'était de remplacer le sous-module d'origine par ma propre fourche
arainone
1
A suivi ces étapes et a constaté que le "Supprimer le répertoire du sous-module extrait lui-même (incertain si cela était nécessaire)" est nécessaire sinon vous rencontrerez "fatal: Pas un référentiel git: ..." lors de l'exécution de la mise à jour du sous-module git
PiersyP
10

Modifiez simplement votre fichier .git / config . Par exemple; si vous avez un sous-module "commun" vous pouvez le faire dans le super-module:

git config submodule.common.url /data/my_local_common
FelipeC
la source
Ce n'est que le meilleur moyen si vous essayez de changer l'URL pour une utilisation unique, pas de façon permanente dans le super projet. Par exemple, vous voulez cloner des sous-modules à partir de copies locales sur disque.
Andy
4

git config --file=.gitmodules -e ouvre l'éditeur par défaut dans lequel vous pouvez mettre à jour le chemin

LuGo
la source