Greifen Sie automatisch über ssh oder https auf Git-Submodule zu

74

Frage:
Gibt es eine Möglichkeit, Git-Submodule automatisch über dieselbe Methode (ssh oder https) wie das Haupt-Repository auszuchecken?

Hintergrund:

Wir haben ein nicht öffentliches Gitlab-Repository ( main) mit einem Submodul ( utils), das auch als nicht öffentliches Gitlab-Repository auf demselben Server gehostet wird. Auf diese Repositorys kann entweder über ssh oder https zugegriffen werden:

Beide Varianten erfordern offensichtlich unterschiedliche Authentifizierungsformen und je nach Client-Computer und Benutzer wird die eine oder andere bevorzugt.

Für das Repository der obersten Ebene ( main) ist dies kein Problem, da jeder die von ihm bevorzugte Methode auswählen kann. Für das Submodul hängt dies jedoch von der .gitmodulesDatei ab und ist daher (anfangs) für alle gleich.
Anstatt dass jeder die .gitmodules-Datei an seine Vorlieben anpassen und sicherstellen muss, dass diese Änderungen nicht versehentlich übernommen werden, wäre es schön, wenn es eine Möglichkeit gäbe, nur den Server- und Repo-Pfad anzugeben, und git wählt entweder die Dieselbe Methode, die für das Haupt-Repo verwendet wird, oder etwas, das in gitconfig festgelegt werden kann.

MikeMB
quelle
tldr sorry. aber ich benutze Git-Hooks zum Laufen git submodule foreach git submodule updateoder ähnliches. Ich habe keine Zeit, eine richtige Antwort zu schreiben, aber ich hoffe, das wird helfen.
Szabolcs Dombi

Antworten:

91

Ich habe dieses Problem endlich gelöst, indem ich die URL des Submoduls als relativen Pfad angegeben habe :

Nehmen wir also an, Ihr Haupt-Git-Repository ist erreichbar

  • entweder über https://gitlabserver.com/my/path/main.git
  • oder über [email protected]:my/path/main.git

Und die .gitmodulesDatei sieht so aus:

[submodule "utils"]     
    path = libs/utils   
    url = https://gitlabserver.com/my/path/utils.git

Dies würde bedeuten, dass auch beim Auschecken der Hauptanwendung über ssh auf die Submodul-Utils über https zugegriffen wird.

Sie können den absoluten Pfad jedoch durch einen relativen Pfad wie den folgenden ersetzen:

[submodule "utils"]     
    path = libs/utils   
    url = ../utils.git

und von nun an verwenden

  • entweder git clone --recursive https://gitlabserver.com/my/path/main.git
  • oder git clone --recursive [email protected]:my/path/main.git

um die gesamte Repository-Struktur nach Belieben abzurufen. Offensichtlich funktioniert dies nicht in Fällen, in denen der relative ssh- und der https-Pfad nicht identisch sind, aber zumindest für von gitlab gehostete Repositorys ist dies der Fall.

Dies ist auch praktisch, wenn Sie (aus welchen Gründen auch immer) Ihre Repository-Struktur an zwei verschiedenen Remotestandorten spiegeln.

MikeMB
quelle
1
Dies funktioniert auch nicht, wenn ein Modul auf ein anderes Repository verweist, oder? Zum Beispiel, wenn dies das zentrale Projekt [email protected]/abc/win/win-agent.git ist und dieses ein referenziertes Modul [email protected]/abc/mob/module.git
David
1
@ David: Ich kann es nicht testen, aber ich verstehe nicht, warum es nicht funktionieren würde (offensichtlich müssten Sie es ../../mob/module.gitin diesem Fall verwenden).
MikeMB
Ich habe es mit ../ getestet. Die Aktualisierung schlägt zwar nicht fehl, aber es scheint mir nicht logisch, es sollte nicht funktionieren, es sollte nur mit ../../ funktionieren, wie Sie geschrieben haben.
David
Ok, folgendes hat funktioniert: Root-Projekt [email protected]/scm/win/win-agent.git Referenzierungsmodul [email protected]/scm/mob/module.git mit folgender Konfiguration: [submodule "modules / Modul "] Pfad = Module / Modul URL = ../../mob/module.git
David
1
Vielen Dank dafür. Eine weitere Sache, die ich tun musste, nachdem ich das geändert hatte .gitmodules, war das Ausführen. git submodule sync (Referenz; dhoeric.github.io/2017/https-to-ssh-in-gitmodules )
Sander Looijenga
9

Ich glaube, ich habe eine allgemeinere Antwort, aber sie ist nicht ganz automatisch. Sie können eine Konfigurationseinstellung anwenden ~/.gitconfig, die eine bestimmte URL durch eine URL Ihrer Wahl ersetzt.

Denn Githubich habe das in meinem ~/.gitconfig:

[url "ssh://[email protected]/"]
    insteadOf = https://github.com/

Hier ist ein Repository mit einem Submodul, das mit einer HTTPS-URL deklariert ist, die ich mit HTTPS rekursiv klonen kann.

git clone --recursive https://github.com/p2/OAuth2.git

ODER

git clone --recursive [email protected]:p2/OAuth2.git

Informationen zur Verwendung finden Sie hier: https://git-scm.com/docs/git-config#Documentation/git-config.txt-urlltbasegtinsteadOf

Und hier: https://git-scm.com/docs/git-clone

Rassig
quelle
Vielen Dank. Diese Einstellung sieht sehr nützlich aus. Ich würde es immer noch vorziehen, relative Pfade zu verwenden, wenn dies möglich ist, da ich nur jemand anderem anweisen kann, Repository X ohne weitere manuelle Konfiguration rekursiv zu klonen. Am anderen Ende scheint es jedoch perfekt zu sein: Ich möchte den Repository-Baum eines anderen klonen, der keine relativen Pfade mit einer anderen Methode (oder einem anderen Spiegel) als dem vom Autor beabsichtigten verwendet.
MikeMB
Und wenn Sie natürlich nicht immer mit relativen Pfaden arbeiten können.
MikeMB
Sichere Sache. Mir ist aufgefallen, dass dies mit XCode und Swift Package Manager nicht besonders gut funktioniert, aber auch nicht mit relativen Submodulen.
Breedly