web-dev-qa-db-fra.com

Comment changer l'URL des sous-modules git localement?

L'original .gitmodules le fichier utilise les URL codées en dur https mais pour certains tests automatisés, je clone à partir de ssh et je fais les URL des sous-modules comme dans ../ModuleName. Je ne veux pas non plus repousser ces modifications dans le référentiel.

# change the https://github.com/ with [email protected]:
sed -i 's/https:\/\/github.com\//[email protected]:/g' ".git/config"
# delete the url lines from the submodule blocks of .git/config
sed -i '/submodule/ {$!N;d;}' ".git/config"
# change hardcoded https:// urls of submodules to relative ones
sed -i 's/https:\/\/github.com\/ProjName/../g' ".gitmodules"
# also make the same change in the .git/modules/*/config
sed -i 's/https:\/\/github.com\/ProjName/../g' .git/modules/*/config
# sync and update
git submodule sync
git submodule update --init --recursive --remote

Avec l'extrait ci-dessus, il fait ce que je veux. Cependant, la chose ennuyeuse est, .git/modules/ le dossier ne semble pas être sous contrôle de version mais si je le supprime simplement, git submodule sync et la plupart des autres opérations Git ne fonctionnent plus.

Existe-t-il un moyen d'obtenir le .git/modules régénéré après avoir modifié le .gitmodules et .git/config des dossiers?

10
abdus_salam

Si vous souhaitez modifier l'URL utilisée pour un sous-module uniquement pour le dépôt local, ne modifiez pas le .gitmodules fichier, c'est uniquement pour les modifications que vous souhaitez pousser.

Au lieu de cela, initialisez d'abord la configuration du sous-module local:

git submodule init

Modifiez ensuite le .git/config fichier pour changer l'URL du sous-module comme d'habitude. (Encore une fois, pas besoin de modifier .gitmodules ici, et s'il s'agit d'un nouveau clone, vous n'aurez probablement pas .git/modules encore.)

Comme @ jthill le souligne , un moyen plus simple de modifier les URL des sous-modules est:

git config submodule.moduleName.url ssh://user@server/path

À ce stade, vous ne souhaitez pas exécuter git submodule sync, car cela écrasera les modifications que vous venez de faire avec les valeurs de .gitmodules fichier. Au lieu de cela, allez directement à:

git submodule update --recursive --remote
22
Scott Weldon

Non seulement vous pouvez modifier l'URL du sous-module avec git config submodule.moduleName.url, mais:

  • 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>

  • avec Git 2.22 (Q2 2019), vous pouvez également le désinstaller :

Voir commit b57e811 , commit c89c494 (08 février 2019), et commit 7a4bb55 (07 février 2019) par Denton Liu (Denton-L) .
(Fusionné par Junio ​​C Hamano - gitster - in commit 01f8d78 , 25 avril 2019)

submodule--helper: enseigner la sous-commande config --unset

Cela enseigne le sous-module - helper config the --unset option, qui supprime la clé de configuration spécifiée de .gitmodule fichier.

C'est:

git submodule--helper config --unset submodule.submodule.url &&
git submodule--helper config submodule.submodule.url >actual &&
test_must_be_empty actual
1
VonC

J'ai essayé la solution ci-dessus mais j'ai eu un tas de problèmes pour une raison quelconque. Ce qui suit est une alternative.

Dans un nouveau référentiel:

  1. git submodule init
  2. Initialisez chaque sous-module manuellement avec git clone ../local/path/to/submodule.git path/in/repo/submodule

Chaque fois que le hachage du sous-module du référentiel racine change et que vous devez synchroniser les sous-modules:

  1. Mettre à jour le référentiel racine
  2. git submodule update avec peut-être --force et --recursive pour faire bonne mesure
0
rendaw