Je ne peux pas mettre à jour le sous-module git, avec l'erreur:
$ git submodule init
Submodule 'build/html' ([email protected]:quadroid/clonejs.git) registered for path 'build/html'
...
$ git submodule update
Cloning into 'build/html'...
Warning: Permanently added 'github.com,207.97.227.239' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.
Mais quand je fais les mêmes tâches localement, tout va bien.
Comment puis-je résoudre ce problème afin que la génération Travis CI passe et que je puisse toujours cliquer sur le sous-module dans le référentiel pour y accéder?
Cela peut (heureusement) être facilement résolu en modifiant le fichier .gitmodules à la volée sur Travis, afin que l'URL SSH soit remplacée par l'URL publique, avant d'initialiser les sous-modules. Pour ce faire, ajoutez ce qui suit à .travis.yml:
# Handle git submodules yourself
git:
submodules: false
# Use sed to replace the SSH URL with the public URL, then initialize submodules
before_install:
- sed -i 's/[email protected]:/https:\/\/github.com\//' .gitmodules
- git submodule update --init --recursive
Merci à Michael Iedema pour son Gist dont j'ai dérivé cette solution.
Si vos sous-modules sont des référentiels privés, cela devrait fonctionner pour inclure les informations d'identification dans les URL https, je recommande de faire un jeton d'accès GitHub avec des autorisations restreintes à cet effet:
# Replace <user> and <token> with your GitHub username and access token respectively
- sed -i 's/[email protected]:/https:\/\/<user>:<token>@github.com\//' .gitmodules
Je recommanderais d'utiliser le schéma https
pour les sous-modules, car cela vous permettra de tirer sur Travis et de pousser localement: https://github.com/quadroid/clonejs.git
.
Travis prend désormais en charge l'accès au sous-module à l'aide de ssh, qui est de loin la solution la plus simple. Il vous suffit d'associer votre clé ssh (ou la clé ssh d'un utilisateur CI dédié) au projet Github que vous construisez, comme décrit dans la documentation pour les dépendances privées .
$ travis sshkey --upload ~/.ssh/id_rsa -r myorg/main
Notez que Travis recommande de créer un utilisateur dédié afin que vous n'ayez pas à utiliser votre propre clé ssh.
Vous obtenez cette erreur car vous avez spécifié vos sous-modules via ssh-urls. Pour l'accès ssh à partir de l'environnement travis-ci, vous devez configurer une clé .
Alternativement, vous pouvez simplement utiliser des URL relatives pour vos sous-modules git puisque vous projetez et vos sous-modules sont tous disponibles sur Github.
Git résout les URL relatives contre Origin
.
Exemple:
En utilisant les 2 premières entrées de votre .gitmodules
:
[submodule "lib/es5-shim"]
path = lib/es5-shim
url = [email protected]:kriskowal/es5-shim.git
[submodule "build/html"]
path = build/html
url = [email protected]:quadroid/clonejs.git
Remplacé par des URL relatives:
[submodule "lib/es5-shim"]
path = lib/es5-shim
url = ../../kriskowal/es5-shim.git
[submodule "build/html"]
path = build/html
url = ../clonejs.git
Ensuite, lors du clonage - disons - via https, l'origine est définie comme suit:
$ git clone https://github.com/quadroid/clonejs.git
$ cd clonejs
$ git remote -v
Origin https://github.com/quadroid/clonejs.git (fetch)
Origin https://github.com/quadroid/clonejs.git (Push)
Lors du clonage via ssh:
$ git clone [email protected]:quadroid/clonejs.git
$ cd clonejs
$ git remote -v
Origin [email protected]:quadroid/clonejs.git (fetch)
Origin [email protected]:quadroid/clonejs.git (Push)
Avec des URL relatives, la séquence de sous-modules habituelle fonctionne indépendamment de l'origine:
$ git submodule init
$ git submodule update
Vous pouvez également manipuler directement votre fichier .gitmodules via git
. (Inspiré par cette réponse ).
git config --file=.gitmodules submodule.SUBMODULE_PATH.url https://github.com/ORG/REPO.git