Question:
Existe-t-il un moyen d'extraire automatiquement les sous-modules git via la même méthode (ssh ou https) que le référentiel principal?
Contexte:
Nous avons un référentiel gitlab non public (main
) qui a un sous-module (utils
) qui est également hébergé en tant que référentiel gitlab non public sur le même serveur. Ces référentiels sont accessibles via ssh ou https:
[email protected]:my/path/repo.git
https://gitlabserver.com/my/path/repo.git
Les deux variantes nécessitent évidemment différentes formes d'authentification et selon l'ordinateur client et l'utilisateur, l'une ou l'autre est préférée.
Pour le référentiel de niveau supérieur (main
), ce n'est pas un problème, car n'importe qui peut choisir la méthode qu'il préfère, mais pour le sous-module, cela dépend du .gitmodules
fichier et est donc (initialement) le même pour tous.
. et git choisit la même méthode que celle utilisée pour le dépôt principal, ou quelque chose qui peut être défini dans gitconfig.
J'ai finalement résolu ce problème en spécifiant l'URL des sous-modules comme chemin relatif :
Disons donc que votre dépôt git principal peut être atteint
https://gitlabserver.com/my/path/main.git
[email protected]:my/path/main.git
Et le .gitmodules
le fichier ressemble à ceci:
[submodule "utils"]
path = libs/utils
url = https://gitlabserver.com/my/path/utils.git
Cela signifierait que même lorsque vous extrayez l'application principale via ssh, les utilitaires du sous-module seraient toujours accessibles via https.
Cependant, vous pouvez remplacer le chemin absolu par un chemin relatif comme celui-ci:
[submodule "utils"]
path = libs/utils
url = ../utils.git
et désormais utiliser
git clone --recursive https://gitlabserver.com/my/path/main.git
git clone --recursive [email protected]:my/path/main.git
pour obtenir toute la structure du référentiel comme vous le souhaitez. Évidemment, cela ne fonctionne pas dans les cas où les chemins ssh et https relatifs ne sont pas identiques, mais au moins pour les référentiels hébergés par gitlab, c'est le cas.
Ceci est également pratique si vous (pour une raison quelconque) mettez en miroir la structure de votre référentiel sur deux sites distants différents.