web-dev-qa-db-fra.com

Accéder automatiquement aux sous-modules git via ssh ou https

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:

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.

34
MikeMB

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

  • soit via https://gitlabserver.com/my/path/main.git
  • ou via [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

  • soit git clone --recursive https://gitlabserver.com/my/path/main.git
  • ou 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.

47
MikeMB