web-dev-qa-db-fra.com

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

J'ai créé un référentiel git avec un sous-module. Je peux dire au sous-module lui-même de changer son chemin d'accès au référentiel distant, mais je ne sais pas comment dire au référentiel parent comment changer le chemin d'accès au référentiel distant pour le sous-module.

Je ne serais pas surpris si je n'ai pas un peu de chance et que je dois faire les choses manuellement, car même supprimer des sous-modules n'est pas facile.

643
Andrew Grimm

Vous devriez simplement pouvoir éditer le fichier .gitmodules pour mettre à jour l'URL, puis exécuter git submodule sync pour refléter cette modification apportée au superprojet et à votre copie de travail.

915
Jim Puls

Ces commandes effectueront le travail sur la commande Invite sans modifier aucun fichier du 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 regarder le blog pour des captures d'écran: Modification de l'URL des sous-modules GIT/Branch en une autre URL/branche du même référentiel

130

En termes simples, il vous suffit d’éditer le fichier .gitmodules, puis de resynchroniser et de mettre à jour:

Editez le fichier, via une commande git ou directement:

git config --file=.gitmodules -e

ou juste:

vim .gitmodules

puis resynchronisez et mettez à jour:

git submodule sync
git submodule update --init --recursive --remote
94

Ce qui a fonctionné pour moi (sous Windows, avec git version 1.8.3.msysgit.0):

  • Mettre à jour .gitmodules avec le chemin du nouveau référentiel
  • Supprimez la ligne correspondante du fichier ".git/config"
  • Supprimer le répertoire correspondant dans le répertoire ".git/modules/external"
  • Supprimer le répertoire de sous-module extrait lui-même (ne pas savoir si cela est nécessaire)
  • Exécuter git submodule init et git 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 tout cela, tout est dans l'état auquel je m'attendais. J'imagine que les autres utilisateurs du référentiel auront les mêmes problèmes quand ils viendront à la mise à jour - il serait sage d'expliquer ces étapes dans votre message de validation!

64
Ben Hymers

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

Alors maintenant, le documentation de gitmodule n'inclut pas encore:

Le fichier _.gitmodules_, situé dans le répertoire de niveau supérieur d'un arbre de travail git, est un fichier texte dont la syntaxe correspond aux exigences -of linkgit: git-config 1 .
[NOUVEAU]:
Ce fichier étant géré par Git, il enregistre les + enregistrements des sous-modules d'un projet.
Les informations stockées dans ce fichier sont utilisées comme un indice pour amorcer la version faisant autorité de l'enregistrement stocké dans le fichier de configuration du projet.
Les modifications d’enregistrements spécifiques à l’utilisateur (par exemple pour tenir compte des différences dans les URL de sous-modules dues à des situations de mise en réseau) doivent être apportées au fichier de configuration , tandis que les modifications d’enregistrement sont propagées (par exemple + dû dans un fichier).

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


Si vous suivez ceci tutoriel de sous-module git , vous constaterez qu'il vous faut un "_git submodule init_" pour ajouter les URL du référentiel de sous-modules à .git/config.

"_git submodule sync_" a 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"

61
VonC

Il suffit de modifier 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
9
FelipeC

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

3
LuGo