J'ai un référentiel git configuré avec plusieurs sous-modules, ce qui crée un .gitmodules
fichier qui est un fichier suivi dans le référentiel parent. Cependant, d'autres développeurs souhaitent travailler sur ce référentiel et consulter les sous-modules. Mais actuellement, les URL des référentiels de sous-modules distants contiennent mon nom d'utilisateur; dans le .gitmodules
fichier c'est quelque chose comme:
[submodule foo]
path = sub/foo
url = https://[email protected]/git/foo.git
De toute évidence, les autres développeurs ne peuvent pas récupérer de example.com
as myuser
(ils n'ont pas mon mot de passe); comment puis-je avoir un référentiel principal vers lequel plusieurs développeurs peuvent tirer/pousser et leur permettre d'avoir un accès individuel aux sous-modules (la configuration d'un nom d'utilisateur unique qu'ils partagent tous sur le serveur hôte du sous-module fonctionnerait, mais ce n'est pas une bonne gestion des utilisateurs) ?
Si je comprends bien, vous utilisez l'authentification de base HTTP sur HTTPS pour autoriser uniquement certains développeurs à accéder au référentiel. Dans ce cas, vous pouvez valider un .gitmodules
qui ressemble à:
[submodule foo]
path = sub/foo
url = https://example.com/git/foo.git
... c'est-à-dire sans nom d'utilisateur, puis demandez à chaque développeur de mettre son nom d'utilisateur et son mot de passe dans son ~/.netrc
fichier. (Si vous utilisez Windows, alors il y a quelques bons conseils à ce sujet ici .) Un simple .netrc
le fichier pourrait ressembler à:
machine example.com
login myusername
password areamandyingtotellsomeonehiscoolpassword
Mise à jour: une alternative, qui n'implique pas l'utilisation de .netrc
, serait la suivante:
Encore une fois, supprimez le nom d'utilisateur de l'URL dans .gitmodules
et valider et pousser ce changement. Lorsque quelqu'un clone le référentiel, il s'exécutait d'abord:
git submodule init
... qui définira l'option de configuration submodule.sub/foo.url
à l'URL dans .gitmodules
. Cependant, l'étape init
ne clonera pas le sous-module jusqu'à ce que vous fassiez git submodule update
, vous pouvez donc faire:
git config submodule.sub/foo.url https://myuser:[email protected]/git/foo.git
... puis:
git submodule update
Pour cloner les sous-modules avec le bon nom d'utilisateur. Notez que votre nom d'utilisateur et votre mot de passe pour l'authentification HTTP seront stockés dans votre configuration git.
En fait, vous pouvez spécifier un chemin "relatif" vers un sous-module dans .gitconfig
:
[submodule foo]
path = sub/foo
url = ./git/foo.git
Cette URL fera référence au même hôte ( https://example.com ) que le référentiel lui-même.
Ce fil m'a aidé, mais j'ajouterais qu'après avoir modifié le contenu du fichier . Gitmodules vous devez exécuter la commande suivante pour que git le récupère:
git submodule sync
La réponse d'Antonk ne fonctionnera pas pour les équipes car le .gitconfig ou .git/config d'un individu n'est pas sous contrôle de version.
Cependant, cela m'a conduit à expérimenter l'url dans des modules .git.
[submodule foo]
path = sub/foo
url = ../foo.git
travaillé pour moi, en supposant que le dépôt de sous-module est dans la même URL que le parent.
Vous pouvez utiliser l'authentification ssh.
il suffit de remplacer cela
[submodule foo]
path = sub/foo
url = https://[email protected]/git/foo.git
avec ça
[submodule foo]
path = sub/foo
url = [email protected]:git/foo.git
J'ai eu ce problème en combinaison avec Gerrit (via ssh).
La suppression du nom d'utilisateur a fonctionné,
donc mon . gitmodules ressemble maintenant à ceci:
[submodule "sub/module1"]
path = sub/module1
url = ssh://servername:29418/module1
Tu peux essayer .insteadOf
, par exemple.
git config --global url."ssh://[email protected]:29418/".insteadOf "ssh://gerrit.foobar.com:29418/"
Chaque développeur devra le faire une fois sur chaque ordinateur sur lequel il travaille.
Modifiez votre .gitmodules
et supprimez le nom d'utilisateur du url
:
[submodule foo]
path = sub/foo
url = https://example.com/git/foo.git
Et enfin:
cd foo/
git submodule init
git submodule update
# Will be prompted to provide username and password