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?
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
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
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:
git submodule init
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:
git submodule update
avec peut-être --force
et --recursive
pour faire bonne mesure